Tengo un programa de cliente/servidor (Windows, winsock2) que se comunica a través de TCP.
El cliente se conecta y envía los datos al servidor (enviar) en 8K en un momento.
El servidor sólo lee los datos (mediante recv).

Ninguna configuración especial hecho en sockets.

Problema:
Cuando la red se produce un error durante la comunicación (por ejemplo, cable sacó), el receptor no recibe los datos enviados con éxito por el momento.
Para simplificar,
Cliente envía 80K de datos en 10 llamadas a enviar. (todos los envíos tienen éxito). 11 de enviar error a causa de algún problema en la red. No hay más datos enviados después de esta.

Problema es que en el receptor, no todos los 80K de datos es recibido. Siempre es menos de 80K.

Espero que como remitente enviado con éxito 80K, TCP garantiza que la cantidad de datos que se entrega a los TCP de destino (datos no puede ser recibido por solicitud de embargo, pero su destino TCP buffers).

Que me estoy perdiendo algo?

Gracias

Edición:

Código de ejemplo

Servidor/receptor

/* 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);

Cliente/remitente :

/* 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

2 Comentarios

  1. 2

    Tu suposición es errónea.

    send() regresar con éxito sólo significa que los datos han sido aceptados para enviar su núcleo podría estar sentados en su envíe colas.

    Si quieres saber si los datos que ha alcanzado el otro extremo, debe ser a nivel de aplicación de los agradecimientos en.

    (Ver también esta pregunta)

    • No ack ser recursivo. Cuando el receptor de la aplicación envía ACK para la recepción de datos, ¿cómo será estar seguro de que todos los bytes de paquete ACK se entregan.
    • Eso es cierto, y es un problema insoluble en el caso general. Lo que esto significa es que el remitente de la aplicación sólo se sabe que el receptor ha visto al menos lo que ha recibido Ack – que debe retransmitir cualquier otra cosa. El transmisor debe estar preparado para detectar y descartar los datos que se ha retransmitido innecesariamente.
  2. 0

    Estás llamando send y recv en un bucle? No garantiza que se envíe o reciba todos los datos o buffer que usted proporcione.

    Conexión TCP Parece Recibir Datos Incompletos

    También usted realmente debe publicar el código, de lo contrario, sólo podemos adivinar.

    • Sí send/recv son llamados en un bucle. Pero supongo que si send() es correcta, que los datos deben llegar a su destino TCP. (y, posteriormente, a la aplicación a través de 1 o más recv() Va a publicar el código en corto tiempo.

Dejar respuesta

Please enter your comment!
Please enter your name here