SIGPIPE не генерируется сразу после первой отправки - PullRequest
0 голосов
/ 19 января 2012

Я хочу знать, возможно ли для сокета tcp немедленно сообщать о любой ошибке сломанного канала.В настоящее время я ловлю сигнал sigpipe на стороне клиента, когда сервер отключается ... но я обнаружил, что сигнал sigpipe генерируется только после того, как 2-е сообщение отправлено с клиента на сервер.что может быть причиной этого ??Если другой конец сокета вышел из строя, то 1-й отправитель должен вернуть sigpipe .. y не тот ли сигнал, сгенерированный немедленно .. ??Есть ли возможное объяснение этому странному поведению?И любой возможный способ обойти это ??

Ответы [ 3 ]

1 голос
/ 19 января 2012

Стек TCP выдаст ошибку только после некоторого количества попыток повторной передачи. IIRC, таймер повторной передачи TCP инициализируется небольшим количеством секунд, а количество повторных передач обычно составляет 5-10. Протокол не поддерживает какие-либо другие средства обнаружения однорангового узла, который стал недоступным во время обмена данными (т. Е. Кто-то споткнулся о кабель питания сервера).

0 голосов
/ 19 января 2012

Я хочу знать, возможно ли для сокета tcp немедленно сообщать о любой ошибке сломанного канала

Другой конец канала находится через сеть. Эта сеть может быть медленной и ненадежной. Таким образом, один конец трубы никогда не может мгновенно сказать, есть ли его партнер еще там. Задержка может быть довольно большой, поэтому O / S также, вероятно, выполнит некоторую буферизацию. Эти соображения делают практически невозможным немедленное обнаружение сломанной трубы.

И любой возможный способ обойти это

Но почему вы хотите? Труба может быть сломана в любой момент во время трансмиссии, так что вам все равно придется разбираться с общим делом.

0 голосов
/ 19 января 2012

Я думаю, использование опции SO_KEEPALIVE может ускорить обнаружение неработающей ссылки.

...