Red de conocimiento informático - Problemas con los teléfonos móviles - El problema de la pérdida de datos en la programación de sockets

El problema de la pérdida de datos en la programación de sockets

En la comunicación por protocolo TCP, el orden en el que el receptor recibe los datos es coherente con el del remitente, pero los paquetes de datos no son necesariamente coherentes. Por ejemplo, el remitente envía 2 paquetes de datos en secuencia. El receptor puede recibirlos todos solo una vez, o puede que sea necesario recibirlos 2 veces, o puede que se reciban 3 veces. El tamaño de los datos recibidos cada vez No lo es. necesariamente del mismo tamaño que el paquete de datos enviado por el remitente, pero el total de datos recibidos al final es consistente.

A juzgar por su programa, el cliente envía 2 paquetes de datos continuamente y el servidor puede recibirlos todos a la vez, o puede recibirlos 2 veces, o puede tardar más de 2 veces en recibirlos. a ellos. . Si agrega algunas declaraciones de retraso entre el envío de "########helloworld" y "######whatisit", como un retraso de 1 segundo, entonces puede estar seguro de que el servidor solo podrá recibirlo. una vez, porque cuando se envía el primer paquete de datos, el servidor recibe los datos una vez, y cuando se envía el segundo paquete de datos, el servidor ya no recibe ninguna acción.

En lo que respecta al programa cliente actual, si desea recibir todos los datos en el lado del servidor, puede considerar recibir los datos en un bucle en el lado del servidor, ensamblando los datos hasta que no haya datos. recibido y luego generar todos los datos recibidos.

mientras(1)

{

int rr;

sock_fd = aceptar( calcetín, NULL, NULL);

retval = 0;

while(1)

{

rr = recv( sock_fd, buf1, MAX_BUFLEN, 0 );

if(rr==0) break;

memcpy(buf+retval,buf1,rr);

retval+=rr;

}

printf("buf= %s\n ##retval=%d\n",buf,retval);

write(sock_fd,"recibir la llamada\n", sizeof("get the call\n")-1);

}

Puedes probarlo. Sólo como referencia.

Encontré la función ioctlsocket

while(1)

{ int rr;

sock_fd = aceptar( sock, NULL, NULL ) ;

retval = 0;

int iMode = 1; //0: bloqueando

ioctlsocket(sock_fd,FIONBIO, (u_long FAR*) &iMode); //Configuraciones sin bloqueo

while(1) { ....... }

.....

}