我有一个非常烦人的问题,我在其他论坛上发现了几次,但是找不到合适的解决方案。
问题是recv()在连接的最后几个字节上返回0。以下是一些背景信息。
我多次调用send()(小块),并从客户端传输了53个字节。
服务器多次调用recv()(4个字节的请求)并读取49个字节,然后返回0(54个字节-49个字节,因此缺少4个字节)。
MSDN和一些论坛写了非阻塞套接字:
读取数据时
MSDN还说:
Using the closesocket or shutdown functions with SD_SEND or SD_BOTH results in a RELEASE signal being sent out on the control channel. Due to ATM's use of separate signal and data channels, it is possible that a RELEASE signal could reach the remote end before the last of the data reaches its destination, resulting in a loss of that data. One possible solutions is programming a sufficient delay between the last data sent and the closesocket or shutdown function calls for an ATM socket.
在recv()和send()的示例中考虑了这一点:http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx
但是仍然没有成功,在收到49字节后,我仍然会在所有连接的10%中遇到一些中断,其中90%的连接成功。有任何想法吗?谢谢。
最佳答案
仅当您请求一个0字节的缓冲区或另一个对等方已正常断开连接时,recv()
才返回0。如果您没有收到期望的所有数据,则说明开始时您没有正确读取数据。请使用您的实际代码更新您的问题。
关于sockets - recv()返回0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10526382/