He estado leyendo Beej's Guide to Network Programming para obtener un control sobre las conexiones TCP. En una de las muestras el código de cliente para un cliente sencillo flujo TCP se parece a:Manejo de retorno parcial desde recv() TCP en C
if ((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
perror("recv");
exit(1);
}
buf[numbytes] = '\0';
printf("Client: received '%s'\n", buf);
close(sockfd);
He puesto el buffer a ser menor que el número total de bytes que estoy enviando. No estoy muy seguro de cómo puedo obtener los otros bytes. ¿Tengo que pasar por encima de recv()
hasta que reciba '\0'
?
* Tenga en cuenta que en el lado del servidor también estoy implementando su función sendall()
, por lo que en realidad debería estar enviando todo al cliente.
Véase también 6.1. A Simple Stream Server en la guía.
Otro enfoque es utilizar el byte final, con especial valor (como ETX) si está seguro de que este valor no puede aparecer dentro del mensaje, o iniciar byte (STX) y byte final (ETX). Es más difícil de manejar en el lado del receptor, pero más robusto. Si algo salió mal y algunos datos se perdieron en la transmisión, el flujo de datos se puede sincronizar fácilmente con STX/ETX, pero en el caso del prefijo de longitud todo se dispara – qrdl