2012-04-03 86 views
1

MSDN说: “调用发送len参数为零是允许的,并且会被实现视为成功。在这种情况下,发送将返回零作为有效值。对于面向消息的套接字,长度传输数据报被发送。“在什么情况下winsock会阻塞send()返回0?

我的问题是,如果len参数不为零,阻塞send()返回0(假设没有超时设置)?

我也是在网上搜索,发现了以下内容:

http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html

“下的Winsock的SIGPIPE/EPIPE功能不存在于所有:发送()要么用于正常断开返回0或-1表示异常断开连接“。

但是,无论我怎样努力,我不能模拟“正常断开”,因此,我不能送()提前返回0

感谢。

回答

0

“正常”断开连接是指接收方在连接结束时呼叫closesocket()向发送方发送FIN数据包。当send()检测到FIN时,它知道连接已正常断开连接并应返回0来通知您的代码。

+0

即使收到FIN,send()仍然会成功。 FIN可能由closesocket,关闭(SD_SEND),关闭(SD_BOTH)引起。 对于关闭(SD_SEND)的情况,随后的send()将始终成功,因为另一方(称为关闭(SD_SEND))应该接收任何进一步的数据。但是,对recv()的调用将返回0. 对于closesocket和shutdown(SD_BOTH)(还有shutdown(SD_RECEIVE)),第一个send()仍然会成功;但是,RST将被退回。下一次调用send()或recv()时,将返回SOCKET_ERROR(-1)。 – JohnTang 2012-04-04 07:46:11

+0

总而言之,无论是什么原因导致FIN,send()都会成功(FIN收到后首次呼叫),或者由于RST(第二次和未来呼叫)而返回-1。 也就是说,阻塞send()永远不会返回0吗?对? (假设没有超时设置) – JohnTang 2012-04-04 07:47:25

相关问题