как бороться с сервером закрыть TCP - PullRequest
0 голосов
/ 10 сентября 2009

Прямо сейчас у меня есть простой TCP-сервер / клиент. Я настроил его так, чтобы всякий раз, когда клиент подключается, он разветвлялся (), а само соединение помещалось в бесконечный цикл, чтобы соединение оставалось открытым. Сервер получает информацию от клиента, у меня есть проверка, чтобы убедиться, что количество полученных байтов> 0. До сих пор это работало хорошо, чтобы определить, отключился ли клиент. Но если сервер отключится, клиент тоже выключится, но не будет установлен errno. Как я могу убедиться, что сервер все еще подключен?

1 Ответ

1 голос
/ 11 сентября 2009

Когда другой конец отключится, сокет станет читаемым (сокет чтения не заблокируется) и read() вернет 0. Это обычный способ обнаружения отключения (похоже, вы уже делаете это на стороне сервера).

Если вы заблокированы в write() или попытаетесь write в сокете, закрытом на другом конце, ваш процесс получит сигнал SIGPIPE и write вернет -1 с errno установить на EPIPE.

Действие по умолчанию для SIGPIPE состоит в том, чтобы завершить процесс, поэтому, если вы этого не изменили, ваш клиент просто умрет, когда попытается выполнить запись на удаленный сервер.

...