Вопрос

Я протестировал тот же тестовый код (сервер - клиент) в двух системах. В одном я получаю сигпип, в другом я не получаю сигпип.

Тестовый сценарий похож на ниже:

Клиент

  1. Подключиться к серверу
  2. Получать данные с сервера
  3. Отправить данные
  4. Закройте гнездо

Сервер

  1. Принять соединение с сервера
  2. Отправить данные клиенту
  3. Получить данные
  4. Отправить данные
  5. Закройте гнездо

В одной системе (клиент и сервер, работающий в той же системе), Sigpipe происходит случайным образом на стороне клиента или сервера.

Но в другой системе эта проблема не происходит с тем же тестовым кодом.

Интересно, имеет ли какое -то отношение к настройкам TCP.

Это было полезно?

Решение

Вы также можете игнорировать Sigpipe от сокета для предотвращения сбоя приложения по этому коду:

int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));

Где SD - это сокет, где вы получаете сигпипсы.

Другие советы

А SIGPIPE Сигнал повышается, если вы попытаетесь написать в розетку, которое другой конец уже закрыт. Здесь есть условие гонки, если один конец закрывает розетку примерно в то же время, что и другой конец, пытается отправить данные - закрытое уведомление может быть получено до или после отправки, вот почему SIGPIPE происходит в одной тестовой среде, а не в другой.

Как правило, приложения с учетом сокетов должны игнорировать SIGPIPE, и вместо этого синхронно обрабатывает полученное EPIPE ошибка от send().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top