2012-05-10 46 views
5

Tengo un problema muy molesto que encontré varias veces en otros foros pero no puedo encontrar una solución adecuada. El problema es que recv() devuelve 0 en los últimos bytes de una conexión. Aquí hay algunos antecedentes.recv() devuelve 0

  • Ambas aplicaciones (cliente/servidor) se ejecutan en la misma máquina.
  • Ambos sockets (cliente/servidor) no bloquean
  • El tamaño de datos transferidos es de 53 bytes.
  • Ambos (cliente/servidor) cierran y cierran la llamada cuando se ejecutó el último envío()/recv().
  • También probé con SO_LINGER y 10 segundos, sin éxito, ya sea

llamo send() varias veces (pequeños trozos) y desde el lado del cliente 53 bytes se transfieren. El servidor llama a recv() varias veces (solicitudes de 4 bytes) y lee 49 bytes y luego devuelve 0 (54 bytes - 49 bytes, por lo que faltan 4 bytes).

MSDN y algunos foros escriben para sockets no bloqueantes:

  • recv() definitivamente devuelve < 0 en caso de error, y errno/WSAGetLastError se establece
  • recv() definitivamente devuelve = 0 cuando la otra parte cerrado la conexión
  • recv() devuelve definitivamente> 0 cuando los datos se leen

MSDN también dice:

El uso de las funciones de cerrar o cerrar con SD_SEND o SD_BOTH hace que se envíe una señal de LIBERACIÓN en el canal de control. Debido a para el uso de canales de datos y señal por parte de ATM, es posible que una señal de LIBERACIÓN alcance el extremo remoto antes de que el último de los datos llegue a su destino, lo que da como resultado la pérdida de esos datos. Una de las posibles soluciones de es programar un retraso suficiente entre los últimos datos de enviados y la función de cierre de bloque o apagado para un socket ATM .

Esto es considerado en el ejemplo de recv() y send(): http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx

Pero aún sin éxito, sigo teniendo algunas interrupciones en el 10% de todas las conexiones después de que se recibe el byte 49, 90 % de las conexiones tienen éxito. ¿Algunas ideas? Gracias.

+0

Sospecho que usted está haciendo uno de varios errores de programación toma clásicos.Tengo algunas ideas, pero prefiero ver tu código antes de escribir algo. – selbie

Respuesta

9

recv() devuelve 0 solo cuando solicita un búfer de 0 bytes o el otro par se desconecta correctamente. Si no está recibiendo todos los datos que espera, entonces no está leyendo los datos correctamente para comenzar. Por favor actualice su pregunta con su código actual.

Cuestiones relacionadas