Ключевые слова:socket, select, (найти похожие документы)
_ RU.UNIX (2:5077/15.22) _____________________________________________ RU.UNIX _
From : Yar Tikhiy 2:5020/118 17 Jul 99 17:37:34
Subj : действие select/read пpи обpыве соединения.
Referat : select read write socket sigpipe
________________________________________________________________________________
Maxim A.Shemanaryov <max@mera.ru> wrote:
MAS> Я принял accept, создался новый сокет и теперь
MAS> я жду пока мне что-то пришлют. Делаю
MAS> как обычно, при помощи select. Hо на том конце
MAS> взяли и закрыли соединение, так ничего и не послав.
MAS> 1) как я могу об этом узнать?
MAS> 2) что вернет select в этом случае?
MAS> 3) есть ли переносимый способ получить такой сигнал?
См. Unix Programming FAQ и Unix Socket FAQ (ищи на Altavista).
Вкратце:
select() вылетит и скажет, что из этого сокета можно читать,
а read() вернет 0 - признак EOF.
SY, Yar
--- ifmail v.2.14dev3 * Origin: Chem. Dept. of Moscow State University (2:5020/118)
_ RU.UNIX (2:5077/15.22) _____________________________________________ RU.UNIX _
From : Valentin Nechayev 2:5020/400 15 Jul 99 13:50:06
Subj : Sockets & select, соединение поpвалось
________________________________________________________________________________
From: "Valentin Nechayev" <nx@nn.kiev.ua>
Reply-To: nx@nn.kiev.ua
Hello Vlad Doubrov!
At 15-Jul-99 07:53, Vlad Doubrov wrote:
> Пришлось мне писать программку-демон для юникса с использованием tcp/ip.
> Входящие данные должны обрабатываться в порядке очереди, поэтому все
> просто - для каждого сокета заводим fd, помещаем их в список и запускаем
> select. Все отлично работает, за исключением одного: когда
> подсоединившийся клиент вылетает аварийно (ну например подвисла у него
> маздайка), select начинает вести совершнно ненормально. Иногда начинает
> возвращать какую-то ересь, а чаще всего программа целиком вылетает с
> сообщением broken pipe, что не есть хорошо для демона.
Hу, лови SIGPIPE и ставь флаг, что какое-то соединение поpвалось.
> В доках по select'у я ничего не нашел про аварийный разрыв соединения.
> Так вот, как узнать, разорвано ли соединение, соответветствующее данному
> fd? И можно ли это сделать вообще?
write()/send() тебе выдаст ECONNRESET или аналог. Если SIGPIPE словишь (или
пpоигноpиpуешь).
--
NN
--- ifmail v.2.14dev3 * Origin: unknown (2:5020/400)