确定.NET套接字当前是否已连接错误?

时间:2009-09-09 09:45:57

标签: c# windows linux tcp

我正在尝试查找Socket当前是否已连接 - 根据Socket.Connected的MSDN文档 - 我应该执行以下操作:

// 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);

我已经通过将套接字连接到在Windows上运行的远程服务器并终止远程服务器来测试它的工作原理。它可以正常工作。

但是,如果我对在Unix上运行的远程服务器(在这种情况下是MAC OS X)执行相同操作,则代码不起作用 - client.Send(tmp, 0, 0)调用完成而不抛出异常并打印“已连接:true ”

我猜这与连接的另一端已经关闭这一事实有关,所以发送可能仍然有效但接收失败 - 我可以做零字节接收或者看看是否有套接字已关闭?

2 个答案:

答案 0 :(得分:2)

是的,你可以。

仅调用发送确实检查本地套接字是否已打开。呼叫接收也将检查另一端。

答案 1 :(得分:1)

也许你可以通过Wireshark嗅到流量,看看如果垂死的服务器端是windows或unix系统有什么不同。

也许垂死的Windows系统能够发送tcp关闭而unix系统不能。这可以解释差异(但可能无法帮助您解决实际问题)。

顺便说一句,如果您使用udp连接,则无法确定其他网站是否存在,因为这将是一个发送&忘了沟通。