Отправка TCP не возвращает причина процесса сбоя

StackOverflow https://stackoverflow.com/questions/1330397

  •  19-09-2019
  •  | 
  •  

Вопрос

Если подключены сервер 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top