Значение свойства tcpClient.Connected
не является надежным, оно зависит от последнего сообщения;поэтому, если последнее сообщение было успешным, тогда его значение равно true, иначе оно равно false.для получения дополнительной информации об этой проверке this .
Используйте это свойство 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;
}
}
}
Изменить: Примечаниечто проверка IsConnected
не помешает ей отключиться после проверки.т. е. возможно, что сокет будет отключен сразу после того, как он был подключен «после проверки IsConnected
, оцененной и вернувшей истину», поэтому вы должны обернуть все коммуникации в блок try/catch
или try/catch/finally
, ожидая, что сокет будет отключен вв любое время.