如果连接仍然打开,Socket.Receive()可以返回0吗?

时间:2011-01-13 21:28:00

标签: c# .net sockets network-programming

我正在编写一个通过套接字发送和接收数据的C#.NET服务器应用程序,如果客户端应用程序在没有正确关闭套接字的情况下崩溃,我会遇到一些问题。

我已将'receive timeout'设置为给定值,并且我希望Socket.Receive()在该时间量之后抛出异常。但是该方法只返回0。

所以我的问题是:如果Socket.Receive()返回0,套接字是否仍然可以打开?或者我可以安全地假设它已经失效了吗?

(理解可能有点棘手。如果是这样,请在评论中告诉我)

2 个答案:

答案 0 :(得分:13)

不。如果你收到0就会失败。

来自MSDN:

  

如果远程主机使用Shutdown方法关闭Socket连接,并且已收到所有可用数据,则Receive方法将立即完成并返回零字节。

http://msdn.microsoft.com/en-us/library/8s4y8aff.aspx

答案 1 :(得分:1)

你的问题有点困惑。 套接字处于打开状态,直到关闭它。 连接处于打开状态,直到任一端关闭它。发送方可以关闭连接的读取端以关闭输出。因此,当读取连接时,如果对等方已关闭他的套接字或将其关闭以进行输出,则您将收到零。此时,您的套接字仍处于打开状态,但您现在应该关闭它。

如果本地应用程序已关闭套接字以进行输入,它也将返回零。