1-如果客户端由于电缆拔出而断开连接,直到下一次读取或写入套接字时才会知道。还要注意 tcpClient.Connected 属性值不可靠,它的值取决于最后一次通信;因此,如果最后一次通信成功,则其值为 true,否则为 false。有关该检查的更多信息。
2-如果您关闭网络流和客户端,这是客户端的正常终止。
3-我不知道,给它一个测试。
如果您知道由于拔掉电缆而导致连接丢失,那么要获得适当的 IsConnected 值,您必须注意在读取或写入 tcp 期间丢失的连接,因此您需要通过尝试访问 tcpclient 成员- 抓住它的运作....
使用此 IsConnected 属性检查 tcpClient 是否已连接:
public static bool IsConnected
{
get
{
try
{
//return _tcpClient != null && _tcpClient.Client != null && _tcpClient.Client.Connected;
if (_tcpClient != null && _tcpClient.Client != null && _tcpClient.Client.Connected)
{
/* As the documentation:
* When passing SelectMode.SelectRead as a parameter to the Poll method it will return
* -either- true if Socket.Listen(Int32) has been called and a connection is pending;
* -or- true if data is available for reading;
* -or- true if the connection has been closed, reset, or terminated;
* otherwise, returns false
*/
// Detect if client disconnected
if (_tcpClient.Client.Poll(0, SelectMode.SelectRead))
{
byte[] buff = new byte[1];
if (_tcpClient.Client.Receive(buff, SocketFlags.Peek) == 0)
{
// Client disconnected
return false;
}
else
{
return true;
}
}
return true;
}
else
{
return false;
}
}
catch
{
return false;
}
}
}