【问题标题】:Can Socket.Receive() return 0 if the connection is still open?如果连接仍然打开,Socket.Receive() 可以返回 0 吗?
【发布时间】:2011-01-13 21:27:59
【问题描述】:

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

我已将“接收超时”设置为给定值,并且我希望 Socket.Receive() 在该时间后抛出异常。但该方法只返回 0。

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

(可能有点难以理解。如果是这样,请在 cmets 中告诉我)

【问题讨论】:

    标签: c# .net sockets network-programming


    【解决方案1】:

    不。如果您收到 0,则表示失败。

    来自 MSDN:

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

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

    【讨论】:

    • 感谢您的快速响应!我读过那篇文章,但我不知道这是否是该方法可以返回 0 的唯一情况。但是您确定吗?
    • @csharptest.net 这也是我的经验。但是您对此有任何参考(官方文档)吗?
    • @RobertHegner:这就是套接字的工作方式。只有当套接字关闭时才能接收到 0。我链接到的MSDN文章还不够官方吗?这是 C 方法的一个:msdn.microsoft.com/en-us/library/windows/desktop/…
    • 嗯...我收到零,但属性 mySocket.Connected 仍然返回 true;我想知道这意味着什么。
    • Connected 不可靠。我认为除非发送某些内容,否则它不会改变。来自 MSDN:如果您需要确定连接的当前状态,请进行非阻塞、零字节的发送调用
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-15
      • 2013-04-13
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      相关资源
      最近更新 更多