2009-09-10 2 views
0

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

+0

Ваш вопрос не очень ясен. Вы хотите убедиться, что сервер остается подключенным при передаче информации клиенту? – chutsu

+0

Вы спрашиваете, как узнать, закрыт ли удаленный конец TCP-соединения? –

+0

Да, я хотел бы знать, что делать на стороне клиента, если сервер случайно отключается. – whatWhat

ответ

1

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

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

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

+0

Незадолго до того, как я прочитал этот ответ, я вспомнил, как запустить его через gdb и увидел, что это сигпип. Я дам вам кредит, где кредит должен быть. Благодаря! – whatWhat

Смежные вопросы