Socket是带状态的网络协议,但是比较麻烦的是并不能直接用Socket.Connected来判断是否仍在连接中。比如一方异常死机或者网络链路中断,这个标志位不能立刻发生改变。
比较实用的是以下判断方式
bool IsConnected(Socket s, int wait_time)
{
try
{
bool part1 = s.Poll(wait_time, SelectMode.SelectRead);
bool part2 = (s.Available == 0);
if (part1 && part2)
{
return false;
}
else
return true;
}
catch(Exception e)
{
return false;
}
}
用Poll函数判断当前是否有数据可以读取,如果可以读取并且Available有效数据长度为0,则表示socket断开。我实验了下确实有效。但是这个方式比较奇葩,不知道微软的人怎么设计成这样的接口。