Как проверить, что клиентское соединение еще живо? - PullRequest
3 голосов
/ 22 июня 2011

Я работаю над сетевым программированием с использованием epoll. У меня есть список подключений и я включил в список каждого клиента. Я могу обнаружить отключение пользователя, читая 0, если пользователь отключился нормально. Однако, если пользователь каким-то образом неожиданно отключился, он не узнает об этом, пока не попытается отправить данные пользователю.

Я не думаю, что epoll предоставляет хороший способ справиться с этим .. поэтому я думаю, что я должен справиться с этим самостоятельно. Я буду очень признателен, если вы, ребята, сможете предоставить мне что-нибудь, например примеры или ссылки, связанные с этой проблемой.

Ответы [ 2 ]

5 голосов
/ 22 июня 2011

epoll_wait вернет EPOLLHUP или EPOLLERR для сокета, если другая сторона отключится. EPOLLHUP и EPOLLERR устанавливаются автоматически, но вы также можете установить более новый EPOLLRDHUP, который явно сообщает об отключении узла.

Также, если вы используете send с флагом MSG_NOSIGNAL, он установит EPIPE для закрытых соединений.

int resp = send (sock, buf, buflen, MSG_NOSIGNAL);

если (соответственно == -1 && errno == EPIPE) {/ * другая сторона ушла * /}

Намного приятнее, чем получать сигнал.

0 голосов
/ 22 июня 2011

А как насчет TCP Keepalive: http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html. См. «Проверка мертвых пиров».Более поздний раздел на том же сайте имеет пример кода: http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/programming.html.

...