Есть ли способ узнать, мертв ли ​​клиентский сокет на моем сервере? - PullRequest
0 голосов
/ 01 марта 2020

когда клиент подключается к моей серверной стороне, после подключения, если он переключается на VPN или что-то еще, серверная сторона все еще говорит, что сокет жив и все еще пытается прочитать с него, я пытался использовать другой поток, чтобы постоянно проверять все мои сокеты с помощью read и закройте его, если он возвращает -1, но все равно ничего не делает

Ответы [ 3 ]

0 голосов
/ 01 марта 2020

Если мы говорим по TCP и если клиентское соединение правильно закрыто, на сервер отправляется сообщение, поэтому сервер будет знать, что соединение закрыто, поэтому read / recv вернет 0 байтов, указывающих EOF.

Но вы спрашиваете о случаях, когда клиент не может связаться с сервером. Обнаружение отсутствия сообщений обязательно выполняется с использованием тайм-аута.

  1. Сервер может периодически «пинговать» клиента (отправлять сообщение, на которое клиент должен ответить).

  2. Вы можете попросить клиента периодически отправлять сообщение («сердцебиение») в режиме ожидания.

В любом случае, нет сообщения (любого типа) для X секунд указывает на разорванное соединение.

0 голосов
/ 01 марта 2020

Если вы включите опцию сокета SO_KEEPALIVE на каждом новом TCP-соединении, ОС будет периодически периодически проверять удаленную сторону, чтобы увидеть, отвечает ли она, и закрывать соединение, если это не так. Время ожидания по умолчанию составляет несколько часов, но многие операционные системы позволяют настроить меньшее время ожидания для каждого сокета. К сожалению, каждый отличается в том, как это сделать. Например, Linux использует опцию сокета TCP_KEEPIDLE. NetBSD (и, вероятно, другие BSD) использует TCP_KEEPALIVE. И так далее.

0 голосов
/ 01 марта 2020

Это очень зависит от того, какой тип протокола вы используете, но общий вопрос: да и нет. Вы должны изучить стек сетевых протоколов, чтобы знать, что вы можете делать в ваших ситуациях, подробности которых вы не раскрыли.

Обычный способ решить эту проблему - установить sh некоторую политику или двустороннюю cpmmunocation. Например, в течение времени Y были отправлены данные np или сообщение «Я жив» от клиента X, мы закрываем соединение. Или отправьте обычное сообщение «ping» клиенту C и ожидайте ответа до истечения периода Y.

...