G
Nochmal ich!
Inzwischen habe ich eine Variante, bei der ich dachte sie müsste funktionieren. Aber das Problem ist, ich muss vor das recv() eine Sleep(1000) - wobei die Sekunde nur zufällig gewählt ist - setzen, damit das funktioniert und das ist nicht die feine englische.
Ich stelle nochmal den Code rein, den ich jetzt habe:
// Socket initialisieren
addr.sin_family = AF_INET;
if(disp_nr == 1)
{
ini.read_ini("options.ini","port1",wert);
addr.sin_port = htons (atoi(wert));
}
if(disp_nr == 2)
{
ini.read_ini("options.ini","port2",wert);
addr.sin_port = htons (atoi(wert));
}
addr.sin_addr.s_addr = htonl (INADDR_ANY);
// einen Socket erstellen für die jeweilige Aufgabe
server = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server == INVALID_SOCKET)
{
AfxMessageBox("Es konnte kein Server Socket erstellt werden!");
owner->ThreadStartet = false;
return 1;
}
// Socket binden
if (bind(server, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)
{
AfxMessageBox("Der Socket konnte nicht an den Port gebunden werden!");
owner->ThreadStartet = false;
return 1;
}
//den Socket auf dem Port "lauschen lassen"
listen(server, SOMAXCONN);
//Events erstellen und binden
KillEvent = CreateEvent(0,FALSE,FALSE,NULL);
ClientEvent = CreateEvent(0,FALSE,FALSE,NULL);
SocketEvent = CreateEvent(0,FALSE,FALSE,NULL);
error = WSAEventSelect(server,SocketEvent,FD_ACCEPT);
error = WSAGetLastError();
//Eventarray für "WaitForMutipleObjects()"
hArray[0] = SocketEvent;
hArray[1] = KillEvent;
while(activ)
{
if(!activ) break;
erg = WaitForMultipleObjects(2,hArray,FALSE,50);
if(erg == WAIT_TIMEOUT) continue; //Timeout ohne Event
if(erg == WAIT_OBJECT_0) //Event für Accept ist passiert
{
strcpy(buffer,"");
empfang = "";
//Ethernet Event accept
client = accept(server, (struct sockaddr*)&from,&fromlen);
if(client == INVALID_SOCKET)
{
error = WSAGetLastError();
continue;
}
error = WSAEventSelect(client,ClientEvent,FD_READ);
error = WSAGetLastError();
hArray_2[0] = ClientEvent;
hArray_2[1] = KillEvent;
erg = WaitForMultipleObjects(2,hArray_2,FALSE,50);
if(erg == WAIT_TIMEOUT) continue; //Timeout ohne Event
if(erg == (WAIT_OBJECT_0 + 1)) //Kill Event ausgelöst, Thread geht zuende
{
activ = false;
continue;
}
if(erg == WAIT_FAILED) //Fehler beim Prüfen auf Events
{
err = GetLastError();
help.Format("Systemfehler: %i",err);
AfxMessageBox(help);
continue;
}
// eigentliche Abarbeitung starten
if(erg == WAIT_OBJECT_0)
{
Sleep(1000); // das ist der unschöne Befehl an der Sache
while(activ)
{
y = recv(client,temp,512,0);
if(y == -1)
{
error = WSAGetLastError();
closesocket(client);
ResetEvent(SocketEvent);
AfxMessageBox("Nich gut");
break;
}
// ab hier liest er dann korrekt, aber nur, wenn ich die Sleep Sekunde einbaue
Das Problem ist, das zweite WaitForMultipleObjects() liefert mir zurück, dass etwas gelesen werden kann, wenn ich aber das recv() ausführe bekomme ich -1 mit der 10035 raus.
Ich war der Meinung, dass die WaitForMultipleObjects() Funktion solange wartet, bis wirklich etwas zu lesen da ist, beim Accept funktioniert das doch auch.
Kann mir jemand helfen und mir zeigen, was da falsch läuft?
Vielen Dank,
Ranger