︙ | | | ︙ | |
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
rr.query = rt->query;
rr.address = address;
rt->query = NULL;
rt->starttime = 0;
SDL_UnlockMutex(resolvermutex);
};
return 0;
};
void
resolverinit(int threads, int limit)
{
resolverlimit = limit;
resolversem = SDL_CreateSemaphore(0);
resolvermutex = SDL_CreateMutex();
|
<
>
|
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
rr.query = rt->query;
rr.address = address;
rt->query = NULL;
rt->starttime = 0;
SDL_UnlockMutex(resolvermutex);
};
return 0;
}
void
resolverinit(int threads, int limit)
{
resolverlimit = limit;
resolversem = SDL_CreateSemaphore(0);
resolvermutex = SDL_CreateMutex();
|
︙ | | | ︙ | |
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
resolverresults.setsize(0);
while (SDL_SemTryWait(resolversem) == 0)
;
loopv(resolverthreads)
{
resolverthread &rt = resolverthreads[i];
resolverstop(rt, true);
};
SDL_UnlockMutex(resolvermutex);
};
void
resolverquery(char *name)
{
SDL_LockMutex(resolvermutex);
resolverqueries.add(name);
SDL_SemPost(resolversem);
SDL_UnlockMutex(resolvermutex);
};
bool
resolvercheck(char **name, ENetAddress *address)
{
SDL_LockMutex(resolvermutex);
if (!resolverresults.empty()) {
resolverresult &rr = resolverresults.pop();
|
<
>
<
>
<
>
|
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
resolverresults.setsize(0);
while (SDL_SemTryWait(resolversem) == 0)
;
loopv(resolverthreads)
{
resolverthread &rt = resolverthreads[i];
resolverstop(rt, true);
}
SDL_UnlockMutex(resolvermutex);
}
void
resolverquery(char *name)
{
SDL_LockMutex(resolvermutex);
resolverqueries.add(name);
SDL_SemPost(resolversem);
SDL_UnlockMutex(resolvermutex);
}
bool
resolvercheck(char **name, ENetAddress *address)
{
SDL_LockMutex(resolvermutex);
if (!resolverresults.empty()) {
resolverresult &rr = resolverresults.pop();
|
︙ | | | ︙ | |
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
if (lastmillis - rt.starttime > resolverlimit) {
resolverstop(rt, true);
*name = rt.query;
SDL_UnlockMutex(resolvermutex);
return true;
};
};
};
SDL_UnlockMutex(resolvermutex);
return false;
};
struct serverinfo {
string name;
string full;
string map;
string sdesc;
int mode, numplayers, ping, protocol, minremain;
|
<
>
<
>
|
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
if (lastmillis - rt.starttime > resolverlimit) {
resolverstop(rt, true);
*name = rt.query;
SDL_UnlockMutex(resolvermutex);
return true;
};
};
}
SDL_UnlockMutex(resolvermutex);
return false;
}
struct serverinfo {
string name;
string full;
string map;
string sdesc;
int mode, numplayers, ping, protocol, minremain;
|
︙ | | | ︙ | |
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
void
addserver(OFString *servername_)
{
@autoreleasepool {
const char *servername = servername_.UTF8String;
loopv(servers) if (strcmp(servers[i].name, servername) ==
0) return;
serverinfo &si = servers.insert(0, serverinfo());
strcpy_s(si.name, servername);
si.full[0] = 0;
si.mode = 0;
si.numplayers = 0;
si.ping = 9999;
si.protocol = 0;
|
|
|
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
void
addserver(OFString *servername_)
{
@autoreleasepool {
const char *servername = servername_.UTF8String;
loopv(servers) if (strcmp(servers[i].name, servername) ==
0) return;
serverinfo &si = servers.insert(0, serverinfo());
strcpy_s(si.name, servername);
si.full[0] = 0;
si.mode = 0;
si.numplayers = 0;
si.ping = 9999;
si.protocol = 0;
|
︙ | | | ︙ | |
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
|
if (si.address.host == ENET_HOST_ANY)
continue;
p = ping;
putint(p, lastmillis);
buf.data = ping;
buf.dataLength = p - ping;
enet_socket_send(pingsock, &si.address, &buf, 1);
};
lastinfo = lastmillis;
};
void
checkresolver()
{
char *name = NULL;
ENetAddress addr = {ENET_HOST_ANY, CUBE_SERVINFO_PORT};
while (resolvercheck(&name, &addr)) {
|
<
>
<
>
|
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
|
if (si.address.host == ENET_HOST_ANY)
continue;
p = ping;
putint(p, lastmillis);
buf.data = ping;
buf.dataLength = p - ping;
enet_socket_send(pingsock, &si.address, &buf, 1);
}
lastinfo = lastmillis;
}
void
checkresolver()
{
char *name = NULL;
ENetAddress addr = {ENET_HOST_ANY, CUBE_SERVINFO_PORT};
while (resolvercheck(&name, &addr)) {
|
︙ | | | ︙ | |
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
|
}
}
int
sicompare(const serverinfo *a, const serverinfo *b)
{
return a->ping > b->ping
? 1
: (a->ping < b->ping ? -1 : strcmp(a->name, b->name));
}
void
refreshservers()
{
checkresolver();
checkpings();
|
|
|
|
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
|
}
}
int
sicompare(const serverinfo *a, const serverinfo *b)
{
return a->ping > b->ping
? 1
: (a->ping < b->ping ? -1 : strcmp(a->name, b->name));
}
void
refreshservers()
{
checkresolver();
checkpings();
|
︙ | | | ︙ | |
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
|
si.numplayers,
si.map[0] ? si.map : "[unknown]",
modestr(si.mode).UTF8String,
si.name, si.sdesc);
}
}
} else {
sprintf_s(si.full)(
si.address.host != ENET_HOST_ANY
? "%s [waiting for server response]"
: "%s [unknown host]\t",
si.name);
}
si.full[50] = 0; // cut off too long server descriptions
@autoreleasepool {
menumanual(1, i, @(si.full));
|
|
<
|
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
|
si.numplayers,
si.map[0] ? si.map : "[unknown]",
modestr(si.mode).UTF8String,
si.name, si.sdesc);
}
}
} else {
sprintf_s(si.full)(si.address.host != ENET_HOST_ANY
? "%s [waiting for server response]"
: "%s [unknown host]\t",
si.name);
}
si.full[50] = 0; // cut off too long server descriptions
@autoreleasepool {
menumanual(1, i, @(si.full));
|
︙ | | | ︙ | |
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
|
pingsock = enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM, NULL);
resolverinit(1, 1000);
};
resolverclear();
loopv(servers) resolverquery(servers[i].name);
refreshservers();
menuset(1);
};
void
updatefrommaster()
{
const int MAXUPD = 32000;
uchar buf[MAXUPD];
uchar *reply = retrieveservers(buf, MAXUPD);
|
<
>
|
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
|
pingsock = enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM, NULL);
resolverinit(1, 1000);
};
resolverclear();
loopv(servers) resolverquery(servers[i].name);
refreshservers();
menuset(1);
}
void
updatefrommaster()
{
const int MAXUPD = 32000;
uchar buf[MAXUPD];
uchar *reply = retrieveservers(buf, MAXUPD);
|
︙ | | | ︙ | |