【问题标题】:How do I make a non-blocking socket call in C# to determine connection status?如何在 C# 中进行非阻塞套接字调用以确定连接状态?
【发布时间】:2013-02-18 23:16:33
【问题描述】:

MSDN 文档中有关 Socket 的 Connected 属性的说明如下:

Connected 属性的值 反映连接的状态 截至最近的操作。如果 你需要确定当前 连接状态,做一个 非阻塞、零字节发送调用。如果 呼叫成功返回或 抛出 WAEWOULDBLOCK 错误代码 (10035),那么套接字仍然 连接的;否则,套接字为否 连接时间更长。

我需要确定连接的当前状态 - 如何进行非阻塞、零字节发送调用?

【问题讨论】:

  • 使用 HTTP Keepalive 会有什么好处吗?

标签: c# sockets


【解决方案1】:

Socket.Connected 属性(至少是 .NET 3.5 版本)的 MSDN 文档底部的示例显示了如何执行此操作:

// .Connect throws an exception if unsuccessful
client.Connect(anEndPoint);

// This is how you can determine whether a socket is still connected.
bool blockingState = client.Blocking;
try
{
    byte [] tmp = new byte[1];

    client.Blocking = false;
    client.Send(tmp, 0, 0);
    Console.WriteLine("Connected!");
}
catch (SocketException e) 
{
    // 10035 == WSAEWOULDBLOCK
    if (e.NativeErrorCode.Equals(10035))
        Console.WriteLine("Still Connected, but the Send would block");
    else
    {
        Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode);
    }
}
finally
{
    client.Blocking = blockingState;
}

 Console.WriteLine("Connected: {0}", client.Connected);

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      仅根据经验提供附加信息:Socket.Connect 的该文档页面的版本 3.5 和 4 底部的 cmets 描述了我的经验 - 该示例根本不起作用。真希望我知道为什么它适用于某些人而不适用于其他人。

      作为一种解决方法,尽管文档说了什么,我还是更改了示例以实际发送没有标志的 1 个字节。这样就成功更新了Connected属性的状态,相当于每隔一段时间发送一个keep-alive包。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-05
        • 2013-07-20
        • 2017-04-18
        • 1970-01-01
        • 1970-01-01
        • 2010-11-15
        相关资源
        最近更新 更多