creo que la mejor manera es leer N bytes hasta que la lectura devuelve 0 (no hay más escritores en el zócalo). ¿Es esto correcto?
0 significa EOF, otro lado ha cerrado la conexión. Si el otro lado de la comunicación cierra la conexión, entonces es correcto.
Si la conexión no está cerrada (transferencias múltiples a través de la misma conexión, protocolo de conversación), entonces el caso es un poco más complicado y el comportamiento generalmente depende de si tiene sockets SOCK_STREAM o SOCK_DGRAM.
Los sockets de datagramas ya están delimitados para usted por el sistema operativo.
Los sockets Stream no delimitan los mensajes (todos los datos son un flujo de bytes opaco) y si lo desea, debe implementarlos en el nivel de aplicación: por ejemplo, definiendo un campo de tamaño en la estructura del encabezado del mensaje o usando un delimitador \ n 'para mensajes de texto de una sola línea). En el primer caso, primero leería el encabezado, extraería la longitud y usaría la longitud para leer el resto del mensaje. En otro caso, lea la secuencia en el búfer parcial, busque el delimitador y extraiga del búfer el mensaje que incluye el delimitador (puede que necesite mantener el búfer parcial ya que dependiendo del protocolo se pueden recibir varios comandos con un solo recv()/lectura ()).
¿Hay una manera de adivinar el tamaño de la memoria intermedia está escrito en la toma?
Para las tomas continuas, no hay una manera confiable ya que la otra parte de la comunicación podría estar aún en proceso de escritura de datos. Imagine el caso bastante normal: el buffer de socket es 32K y se está escribiendo 128K. La aplicación de escritura bloquearía dentro de send()/write(), el sistema operativo en espera de que la aplicación de lectura lea los datos y, por lo tanto, libere espacio para la próxima porción de datos escritos.
Para conectores de datagramas, uno normalmente conoce el tamaño del mensaje de antemano. O uno puede intentar (nunca lo hice yo mismo) recvmsg (MSG_PEEK) y si el MSG_TRUNC está en el msghdr.msg_flags devuelto, intente aumentar el tamaño del búfer.
Hola, y gracias. ¿Cuál es el cuarto argumento en lectura? – Donovan
@Alberto, ah, eso es un error tipográfico. Solo debe ser 3 para leer, escribí 'recv' primero ... – epatel