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;
}
}
}