我有一个非常讨厌的问题,我在其他论坛上发现了几次,但我找不到合适的解决方案 . 问题是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使用单独的信号和数据信道,RELEASE信号有可能在最后一个数据到达目的地之前到达远端,导致数据丢失 . 一种可能的解决方案是在发送的最后一个数据和ATM套接字的关闭或关闭函数调用之间编程足够的延迟 .
但仍然没有成功,在收到49字节后,我仍然在10%的连接中得到一些中断,90%的连接成功 . 有任何想法吗?谢谢 .