Как можно проверить если сетевой сокет (Система. Сеть. Сокеты. Сокет), все еще соединен, если другой хост не отправляет Вам пакет, когда он разъединяется (например, потому что он разъединился неизящно)?
Как Пол Тернер ответил, Socket.Connected
не может использоваться в этой ситуации. Вам нужно каждый раз опрашивать соединение, чтобы видеть, активно ли оно. Это код, который я использовал:
bool SocketConnected(Socket s)
{
bool part1 = s.Poll(1000, SelectMode.SelectRead);
bool part2 = (s.Available == 0);
if (part1 && part2)
return false;
else
return true;
}
Он работает следующим образом:
s.Poll
возвращает истину, если
s.Available
возвращает количество байтов, доступных для чтения Свойство Socket.Connected
сообщит вам, считает ли сокет , что он подключен . Фактически он отражает состояние последней операции отправки / получения, выполненной в сокете.
Если сокет был закрыт вашими собственными действиями (удаление сокета, вызов методов для отключения), Socket.Connected
вернет false
. Если сокет был отключен другим способом, свойство вернет true
до следующей попытки отправить или получить информацию, после чего либо SocketException
, либо ObjectDisposedException
] будет брошен.
Вы можете проверить свойство после возникновения исключения, но раньше это ненадежно.
Лучше всего, чтобы ваш клиент отправлял PING каждые X секунд, а сервер предположим, что он отключен после того, как какое-то время не получал его.
Я столкнулся с той же проблемой, что и вы, при использовании сокетов, и это был единственный способ сделать это. Свойство socket.connected никогда не было правильным.
В конце концов, я переключился на использование WCF, потому что он был намного надежнее сокетов.