recv()返回0

Hel*_*rld 6 sockets shutdown zero recv closesocket

我有一个非常讨厌的问题,我在其他论坛上发现了几次,但我找不到合适的解决方案.问题是recv()在连接的最后几个字节返回0.以下是一些背景信息.

  • 两个(客户端/服务器)应用程序都在同一台机器上运行.
  • 两个(客户端/服务器)套接字都是非阻塞的
  • 传输的数据大小为53个字节.
  • 两个(客户端/服务器)在执行最后一个send()/ recv()时调用shutdown和closesocket.
  • 我也试过SO_LINGER 10秒钟,也没有成功

我调用send()几次(小块),从客户端调用53个字节.服务器多次调用recv()(4字节请求)并读取49个字节然后返回0(54字节 - 49字节,因此缺少4个字节).

MSDN和一些论坛写的非阻塞套接字:

  • recv()肯定在错误时返回<0并且设置了errno/WSAGetLastError
  • 当对方关闭连接时,recv()肯定返回= 0
  • 当读取数据时,recv()肯定会返回> 0

MSDN还说:

使用带有SD_SEND或SD_BOTH的closesocket或shutdown功能会导致在控制通道上发送RELEASE信号.由于ATM的使用单独的信号和数据信道的,有可能是最后的数据到达目的地之前,导致数据丢失释放信号可以达到远端.一种可能的解决方案是在发送的最后一个数据和ATM套接字的关闭或关闭函数调用之间编程足够的延迟.

这在recv()和send()的例子中被认为:http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v = vs.85).aspx

但仍然没有成功,在收到49字节后,我仍然在10%的连接中得到一些中断,90%的连接成功.有任何想法吗?谢谢.

Rem*_*eau 12

recv()仅当您请求0字节缓冲区或另一个对等体已正常断开连接时,才返回0.如果您没有收到所需的所有数据,那么您开始时并没有正确读取数据.请使用您的实际代码更新您的问题.