我正在尝试查找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 ”
我猜这与连接的另一端已经关闭这一事实有关,所以发送可能仍然有效但接收失败 - 我可以做零字节接收或者看看是否有套接字已关闭?
答案 0 :(得分:2)
是的,你可以。
仅调用发送确实检查本地套接字是否已打开。呼叫接收也将检查另一端。
答案 1 :(得分:1)
也许你可以通过Wireshark嗅到流量,看看如果垂死的服务器端是windows或unix系统有什么不同。
也许垂死的Windows系统能够发送tcp关闭而unix系统不能。这可以解释差异(但可能无法帮助您解决实际问题)。
顺便说一句,如果您使用udp连接,则无法确定其他网站是否存在,因为这将是一个发送&忘了沟通。