我有一个非常烦人的问题,我在其他论坛上多次发现,但我找不到合适的解决方案。问题是 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 或关闭函数会导致在控制通道上发送 RELEASE 信号。由于 ATM 使用单独的信号和数据通道,RELEASE 信号可能会在最后一个数据到达其目的地之前到达远端,从而导致该数据丢失。一种可能的解决方案是在最后发送的数据与 ATM 套接字的 closesocket 或关闭函数调用之间设置足够的延迟。
这在 recv() 和 send() 的例子中被认为是:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms740121 (v=vs.85).aspx
但是仍然没有成功,在收到 49 字节后,我仍然在 10% 的连接中得到一些中断,90% 的连接成功。有任何想法吗?谢谢。