LINUX.ORG.RU

Баги в select!


0

0

Linux 2.2.24

Select почему-то не перехватывает все out-of-band data.
Ниже приведенный код по идее должен принимать все exception
на select-е, но реально принимает не более 3-5,
затем ниче не принимается.

int maxfd = 0;
fd_set set;
int status = -1;
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;

FD_ZERO(&set);
maxfd = sock;
FD_SET(sock, &set);

for(;;)
{
if( (status = select(maxfd+1, NULL, NULL, &set, &timeout)) > 0 ) {
if( FD_ISSET(sock, &set) ) {
char c = '\0';
if( recv(sock, c, 1, MSG_OOB) <= 0 ) {
printf("Error: recv() failed!");
break;
}
printf("[recv] c: %c\n", c);
}
} else if(status == 0) {
printf("Timeout\n");
} else {
break;
}
}

anonymous

Re: Баги в select!

man 2 select:

...
Consider timeout to be undefined after select returns.
...

Die-Hard ★★★★★ ()

Re: Баги в select!

Так timeout-а не должно быть, поскольку out-of-band data посылаются каждые 2 секунды, и по ману должны соответственно приниматься.

Может они быстрее, чем Select устанавливается, приходят?

anonymous ()

Re: Баги в select!

Поставь строчки

timeout.tv_sec = 5;
timeout.tv_usec = 0;
FD_ZERO(&set);
FD_SET(sock, &set);

ВНУТРИ тела for(;;)

Die-Hard ★★★★★ ()
Ответ на: Re: Баги в select! от anonymous

Re: Re: Баги в select!

Тады не знаю. Слишком мало информации.
Думаю, все же, с селектом все в порядке.

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