Я написал tcp-сервер, каждый раз, когда принимается соединение с клиентом, экземпляр сокета возвращается Accept
или EndAccept
, который называется обработчиком и многими другими данными, собранными в объекте под названием TcpClientConnection
. Мне нужно определить, соединение связано или нет в течение определенного интервала времени, свойство Socket.Connected
не является надежным, и в соответствии с документацией я должен использовать метод Poll
с опцией SelectRead
. с тестовым сценарием i отключите кабель клиента и дождитесь прерывистого сигнала тревоги, который построен на handler.Poll(1, SelectMode.SelectRead)
, он должен возвращать true, но это никогда не происходило.Определите поврежденное соединение на сервере TCP
ответ
Согласно документации Socket.Poll:
Этот метод не может обнаружить некоторые виды проблем подключения, таких как сломанный сетевой кабель, или что удаленный хост был выключен неизящно. Вы должны попытаться отправить или получить данные для обнаружения таких ошибок.
Другими словами - опрос полезен для проверки наличия и доступности некоторых данных в сетевом стеке локальной сети. Если вам нужно, чтобы обнаружить проблемы соединения необходимо вызвать блокирование чтения (например, Socket.Receive
)
Вы также можете создать простую инициализацию miniprotocol заменить некоторые согласились «привет» назад и вперед сообщение. Вот упрощенный пример того, как можно это сделать:
private bool VerifyConnection(Socket socket)
{
byte[] b = new byte[1];
try
{
if (socket.Receive(b, 0, 1, SocketFlags.None) == 0)
throw new SocketException(System.Convert.ToInt32(SocketError.ConnectionReset));
socket.NoDelay = true;
socket.Send(new byte[1] { SocketHelper.HelloByte });
socket.NoDelay = false;
}
catch (Exception e)
{
this._logger.LogException(LogLevel.Fatal, e, "Attempt to connect (from: [{0}]), but encountered error during reading initialization message", socket.RemoteEndPoint);
socket.TryCloseSocket(this._logger);
return false;
}
if (b[0] != SocketHelper.HelloByte)
{
this._logger.Log(LogLevel.Fatal,
"Attempt to connect (from: [{0}]), but incorrect initialization byte sent: [{1}], Ignoring the attempt",
socket.RemoteEndPoint, b[0]);
socket.TryCloseSocket(this._logger);
return false;
}
return true;
}
Это принципиально вызвано тем, как TCP и IP протоколы работы. Единственный способ определить, отключено ли соединение, - это отправить некоторые данные по соединению. Основной TCP-протокол приведет к отправке подтверждений от приемника обратно отправителю, что позволит обнаружить поврежденное соединение.
Эти статьи содержат больше информации
Спасибо за ваши ссылки – AhmadAli
могли бы вы предоставить код? – Henningsson