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

Schreibe einen Kommentar