LINUX.ORG.RU

select, FD_ISSET, socket, тупняк


0

0

привет тем, кто уже/ещё не спит в день взятия Бастилии.

у меня проблема со следующим кодом:


do {
FD_ZERO( &read);
FD_ZERO( &write);
FD_SET ( s, &read);
FD_SET (s, &write);
...
retval = select(Max+1, &read, &write, NULL, NULL );
if( retval > 0) {
if ( FD_ISSET ( s, &read) ) {
r = recv (s ...)
}


я часто попадаю в ветку, когда согласно селект - данные на чтение в сокете есть, а вот при получении этих данных получаю 0 байт.
я где-то мануалы не дочитал? или ещё что-то?


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

> Смотри man select, секцию BUGS

А вот до туда я как-то и не дочитал.

Under Linux, select() may report a socket file descriptor as «ready for reading», while nevertheless a subsequent read blocks. This could for example happen when data has arrived but upon examination has wrong checksum and is discarded. There may be other circumstances in which a file descriptor is spuriously reported as ready. Thus it may be safer to use O_NONBLOCK on sockets that should not block.

Спасибо.

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

> FD_CLR нужно делать

да у меня как-то в начале цикла FD_ZERO выполняется. вроде не так нужно удалять из набора дескриптор.

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

секс разный бывает. Не все виды одинаково полезны :)

true_admin ★★★★★
()

> я где-то мануалы не дочитал?

Угу. На recv(2) недочитал:

The return value will be 0 when the peer has performed an orderly shutdown.

kemm
()

Мож соединение закрылось? ;)

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

Угу, тебе стоит юзать O_NONBLOCK. Если данные есть - оно их и прочитает. Если нету - все равно не повиснешь.

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