Влияет ли какая-либо из настроек TCP на SIGPIPE? - PullRequest
1 голос
/ 20 января 2011

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

Сценарий тестирования выглядит примерно так:

Клиент

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

Сервер

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

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

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

Интересно, как-то связана неисправная труба с настройками TCP.

Ответы [ 2 ]

1 голос
/ 20 января 2011

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

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

Где sd - сокет, где вы получаете SIGPIPE.

1 голос
/ 20 января 2011

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

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

...