TCP send/recv error reporting
Ich habe eine client/server-Programm (Windows, winsock2) die Kommunikation über TCP.
Der client verbindet sich und sendet Daten an server (senden) in 8K zu einer Zeit.
Der server liest Daten mit recv).
Keine speziellen Einstellungen erfolgt über sockets.
Problem:
Wenn einige Netzwerk-Fehler tritt während der Kommunikation (Z. B. Kabel gezogen), Empfänger nicht erhalten Daten erfolgreich gesendet.
Zu vereinfachen,
Client geschickt 80K Daten in 10 Anrufe zu senden. (alle sendet erfolgreich sind). 11. senden fehlgeschlagen, weil einige Netzwerk-Problem. Keine Daten mehr gesendet, nachdem diese.
Problem ist, dass beim Empfänger, nicht alle 80K Daten empfangen werden. Es ist immer weniger als 80K.
Erwarte ich als sender als erfolgreich gesendet 80K, TCP garantiert, dass viele Daten geliefert, um Ziel-TCP (Daten können nicht empfangen werden, durch Anwendung noch nicht, aber Ihre in den Ziel-TCP-Puffer).
Bin ich etwas fehlt?
Dank
Edit:
Beispielcode
Server/Empfänger
/* create socket */
/* listen */
/* accept connection */
char recvbuf[8192];
do {
iResult = recv(ClientSocket, recvbuf, sizeof(recvbuf), 0);
if (iResult > 0) {
total += iResult;
printf("Total bytes received: %d\n", total);
}
else if (iResult == 0) {
printf("Connection is closing...\n");
break;
}
else {
printf("recv failed: %d\n", WSAGetLastError());
break;
}
} while (iResult > 0);
Client/sender :
/* create socket */
/* connect to server */
char sendbuf[8192];
do {
//Send an initial buffer
iResult = send( ConnectSocket, sendbuf, sizeof(sendbuf), 0 );
if (iResult == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
break;
}
total += iResult;
printf("Total bytes Sent: %ld\n", total);
} while(iResult > 0);
//wait before cleaning up
getc(stdin);
InformationsquelleAutor Rohan | 2009-12-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Annahme ist fehlerhaft.
send()
Rückkehr erfolgreich bedeutet nur, dass die Daten angenommen wurden, senden Sie von Ihrem kernel - könnte es immer noch sein, Sie sitzen in Ihrem schicken Warteschlangen.Wenn Sie wissen möchten, ob die Daten hat, erreicht das andere Ende, müssen Sie die application-level-Bestätigungen.
(Siehe auch diese Frage)
Das ist wahr, und ist ein unlösbares problem im Allgemeinen Fall. Was dies bedeutet ist, dass Ihre Absender-Anwendung nur weiß, dass der Empfänger gesehen hat mindestens was hat die empfangene ACKs für - es muss erneut alles andere. Ihr Absender muss dann bereit sein zu erkennen und verwerfen von Daten, die erneut übertragen unnötig.
InformationsquelleAutor caf
Rufen Sie
send
undrecv
in einer Schleife? Sie garantieren nicht, dass Sie senden oder empfangen alle Daten oder Puffer, die Sie stellen.TCP-Verbindung Scheint zu Erhalten Unvollständige Daten
Außerdem solltest du wirklich post code, sonst können wir nur raten.
InformationsquelleAutor Tim Sylvester