Отправка TCP не возвращает причина процесса сбоя
Вопрос
Если подключены сервер TCP и клиент, я хотел бы определить, когда клиент больше не подключен. Я подумал, что смогу просто сделать это, попытая отправить сообщение клиенту и после возвращения () с -1, я могу снести гнездо. Эта реализация работает в Windows, но в ту минуту, когда я пытаюсь сделать это на Linux с помощью BSD -разъемами, вызов Send () в приложении на стороне сервера приводит к сбою приложения моего сервера, если клиент больше не подключен. Это даже не возвращает -1 ... просто завершает программу.
Пожалуйста, объясните, почему это происходит. Заранее спасибо!
Решение
Это вызвано сигналом Sigpipe. Видеть send(2)
:
Функция send () должна сбой, если:
Epipe] Гребень выключается для написания, или гнездо является режимом подключения и больше не подключен. В последнем случае, и если сокет имеет типа sock_stream или sock_seqpacket, и флаг msg_nosignal не установлен, сигнал Sigpipe генерируется в вызову.
Вы можете избежать этого, используя MSG_NOSIGNAL
флаг на send()
позвонить или игнорируя SIGPIPE
сигнал с signal(SIGPIPE, SIG_IGN)
в начале вашей программы. Тогда send()
функция вернет -1 и установлен errno
к EPIPE
в этой ситуации.
Другие советы
Вам нужно игнорировать сигнал Sigpipe. Если ошибка записи происходит в розетке, ваш процесс с Get Sigpipe, а поведение по умолчанию этого сигнала - убить ваш процесс. Написание сетевого кода на *nix, который вы обычно хотите:
signal(SIGPIPE,SIG_IGN);