LINUX.ORG.RU

Ошибка на стороне сервер


0

1

Всем привет, подскажите почему в случае если я до завершения передачи принудительно закрою клиент то сервер выдаёт ошибку. При завершении процесса закрываются все его дескрипторы и тд. тоесть отсылает сигнал FIN серверу. Сервер в это время крутит циклично write() и видимо когда соединения больше нет вылетает так как его никто не предупредил, соответственно в таких случаях нужно както особо настраивать сервер или иначе создавать сокет а не просто сокет(аф_инет, сокет стрим) бинд листен асепт. я прав? :)

Если надо будет добавить код напишите об этом.


Ответ на: комментарий от Onito

Не так. Сокеты асинхронные и молчаливые по своей сути, так что после физ.обрыва его обнаружит только следующий врайт. Но если состояние разрыва еще не опознано, а буфер отправки свободен, значит можно в него писать без ошибок — полл об этом и сообщит. Этот врайт приведет к узнаванию о разрыве, которое и выстрелит в следующем полле. Собственно при разрыве последние врайты не факт что дошли — это аксиоматика тисипи.

Есть еще нормальное завершение, tcp-fin пакет (close/shutdown), оно приходит само, без врайт-теста.

arturpub ★★
()
Ответ на: комментарий от arturpub

ок, тогда почему если убрать полл то крашица всё? если врайт узнал что о разрыве что он делает? получается первый врайт после обрыва не ломает прогу, тогда почему второй ломает?

Onito
() автор топика
Ответ на: комментарий от Onito

Потому что первый (на самом деле пред-какой-то) инициировал узнавание, узнавание случилось, потом последний отхватил. В случае полл-врайта полл отхватывает, но не ненерит сигнал. Если в поллхапе сделать врайт, все снова упадет.

arturpub ★★
()
Ответ на: комментарий от arturpub

ну я так и думал :) прост хотел убедиться

Onito
() автор топика
Ответ на: комментарий от Onito

Идея такая, что нельзя писать в *заведомо* брокен пайп, а проверять его можно.

arturpub ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.