E
So, ich mal wieder. Also ich schreib gerade an einem Game Serverbrowser. Die Serverliste wird vom Masterserver geholt und die erhaltenen IP Adressen werden über mehrere Threads (Standart im 30ms Zyklus, aber über Variable veränderbar), abgefragt und die so erhaltenen Daten aufbereitet und in einem Listview sichtbar gemacht. Das Proggy läuft soweit auch unter Win98SE, aber unter WinXP crasht es je nach Zeiteinstellung für den Abfragezyklus, meist befinden sich so 1600 IP Adressen in der Masterliste die abgefragt werden, und so so nach 700 - 800 Abfragen verabschiedet sich das Programm mit der Standart Fehlermeldung, daß irgendwelche Daten zu Microsoft geschickt werden wollen. Laut Fehlermeldung scheinen wohl die Datn im Seicher zu kolidieren. Die Fehlermeldung lautet in etwas so: Die Anweisung"0x36363456" verweist auf Speicher "0x23525f523". Der Vorgang "read" konnte nicht auf den Speicher durchgeführt werden. Ich poste jetzt mal den Code für den Thread, im Code ist eine Zeile markiert, wenn ich die wegnehme dann laufen alle Threads komplett durch und ich kann die Zykluszeit sogar bis 5ms oder weniger runterziehen.
void Scan_GameServer(serverinfo_t *server){
u_char recvBuff[BUFFERSIZE];
fd_set stoc;
int result, fromlen, i, players = 0, cvar_index;
struct sockaddr dgFrom;
SOCKET sd;
TIMEVAL delay;
SOCKADDR_IN addr;
DWORD now;
char *p, *rLine, *token, lasttoken[256], seps[] = "\\";
tmp.countdown_num_of_servers--;
memset(&addr, 0, sizeof(addr));
memset(&recvBuff, 0, sizeof(recvBuff));
addr.sin_family = AF_INET;
addr.sin_port = 0;
sd = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
addr.sin_addr.S_un.S_addr = server->ip;
addr.sin_port = htons(server->port);
SendMessage (Wnd_StatusBar, SB_SETTEXT, (WPARAM) 0, (LPARAM)va("Scanning %s:%d", inet_ntoa(addr.sin_addr), server->port));
timeBeginPeriod (1);
server->start_scantime = timeGetTime();
for (i = 0; i < 2; i++){
result = sendto (sd, QUERY_STRING, sizeof(QUERY_STRING), 0, (struct sockaddr *)&addr, sizeof(addr));
if (result == SOCKET_ERROR) {
SendMessage (Wnd_StatusBar, SB_SETTEXT, (WPARAM) 0, (LPARAM)va("Socket error: %d", WSAGetLastError()));
break;
}
memset (&stoc, 0, sizeof(stoc));
FD_SET (sd, &stoc);
delay.tv_sec = 2;
delay.tv_usec = 0
result = select (0, &stoc, NULL, NULL, &delay);
if (result) {
fromlen = sizeof(dgFrom);
//---------------------------------------------------------------------------- Diese Zeile schiest mir immer das Programm weg
result = recvfrom (sd, recvBuff, sizeof(recvBuff), 0, &dgFrom, &fromlen);
//------------------------------------------------------------------------------------------------------------------------------------
if (result >= 0){
tmp.recieved_bytes += result;
break;
}
} else {
result = -1;
SendMessage (Wnd_StatusBar, SB_SETTEXT, (WPARAM) 0, (LPARAM)va("No Response %s:%d (attemp %i)", inet_ntoa (addr.sin_addr), server->port, i+1));
}
}
closesocket(sd);
now = timeGetTime();
server->last_scantime = now;
timeEndPeriod(1);
if (result >= 0){
server->ping = (u_short)(now - server->start_scantime);
server->responding = TRUE;
p = recvBuff;
rLine = GetLine (&p, &result); //GetLine: externe Funktion, zur Stringübergabe
free (rLine);
rLine = GetLine (&p, &result);
token = strtok(rLine, seps);
i = cvar_index = 0;
while( token != NULL ){
if (!_stricmp (lasttoken, "sv_hostname")){
strcpy (server->servername, token);
}else if (!_stricmp (lasttoken, "mapname")){
strcpy (server->mapname, token);
}else if (!_stricmp (lasttoken, "gamename")){
strcpy (server->modname, token);
}else if (!_stricmp (lasttoken, "sv_keywords")){
strcpy (server->keywords, token);
}else if (!_stricmp (lasttoken, "sv_maxclients")){
server->max_clients = atoi(token);
}else if (!_stricmp (lasttoken, "protocol")){
server->protocol = atoi(token);
}else if (!_stricmp (lasttoken, "g_needpass")){
server->need_password = atoi(token);
}
if(i == 0){
i++;
}else{
strcpy (server->cvars[cvar_index].name, lasttoken);
strcpy (server->cvars[cvar_index].value, token);
cvar_index++;
i = 0;
}
strcpy (lasttoken, token);
token = strtok( NULL, seps );
}
free (rLine);
strcpy (seps, " ");
while (rLine = GetLine (&p, &result)){
token = strtok( rLine, seps);
server->players[players].score = atoi(token);
token = strtok( NULL, seps);
server->players[players].ping = atoi(token);
token = strtok( NULL, "\"");
if (token){
strncpy (server->players[players].playername, token, sizeof(server->players[players].playername)-1);
}else{
server->players[players].playername[0] = '\0';
}
players++;
free (rLine);
}
server->cur_clients = players;
server->num_of_cvars = cvar_index;
}else{
server->ping = 9999;
server->responding = FALSE;
strcpy(server->servername,"- no response -");
strcpy(server->mapname,"- no info -");
strcpy(server->modname,"- no info -");
server->cur_clients = 0;
server->max_clients = 0;
server->num_of_cvars = 0;
}
EnterCriticalSection(&My_CriticalSection);
Show_ServerData(server->id);
LeaveCriticalSection(&My_CriticalSection);
ExitThread(0);
}