Влияет ли какие -либо настройки TCP Sigpipe?
Вопрос
Я протестировал тот же тестовый код (сервер - клиент) в двух системах. В одном я получаю сигпип, в другом я не получаю сигпип.
Тестовый сценарий похож на ниже:
Клиент
- Подключиться к серверу
- Получать данные с сервера
- Отправить данные
- Закройте гнездо
Сервер
- Принять соединение с сервера
- Отправить данные клиенту
- Получить данные
- Отправить данные
- Закройте гнездо
В одной системе (клиент и сервер, работающий в той же системе), Sigpipe происходит случайным образом на стороне клиента или сервера.
Но в другой системе эта проблема не происходит с тем же тестовым кодом.
Интересно, имеет ли какое -то отношение к настройкам TCP.
Решение
Вы также можете игнорировать Sigpipe от сокета для предотвращения сбоя приложения по этому коду:
int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));
Где SD - это сокет, где вы получаете сигпипсы.
Другие советы
А SIGPIPE
Сигнал повышается, если вы попытаетесь написать в розетку, которое другой конец уже закрыт. Здесь есть условие гонки, если один конец закрывает розетку примерно в то же время, что и другой конец, пытается отправить данные - закрытое уведомление может быть получено до или после отправки, вот почему SIGPIPE
происходит в одной тестовой среде, а не в другой.
Как правило, приложения с учетом сокетов должны игнорировать SIGPIPE
, и вместо этого синхронно обрабатывает полученное EPIPE
ошибка от send()
.