LINUX.ORG.RU

accept & select

 , ,


0

1

Вот есть у нас select. Он ассинхронный. И еще у нас accept есть. Как правильно while в этом случае написать?

while(s.listen() && (s2 = s.accept() != INVALID_SOCKET))
{
	printf("Someone is comming: %i\n", s2);
}

Куда тут select вставить?

чт-? man man, man select

anonymous
()

Вот есть у нас select. Он ассинхронный.

Сделай синхронным и туда же засунь listening socket. В итоге должен получиться аккуратным event loop. Только... всё уже придумано до нас, см. libev.

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

Нашел как. Надо в FD_SET наш сокет запихать и когда select делаешь проверять он это или нет, если да - тогда accept делать.

facelift
() автор топика
while(s.listen() && (s2 = s.accept() != INVALID_SOCKET))

что это за непонятное нечто, нафиг каждый раз дергать listen(), если это перевод в режим прослушивания сокета с пулом подключений... маны почитайте батенька, при асинхронном режиме s.accept() будет возвращать постоянно -1

If no pending connections are present on the queue, and the socket is not marked as nonblocking, accept() blocks the caller until a connection is present. If the socket is marked nonblocking and no pending connections are present on the queue, accept() fails with the error EAGAIN or EWOULDBLOCK.

anonymous
()

Работать с сокетами как-то так (man 2 select):

int s = socket(...);
bind( s, ... );
listen( s, ... );

while ( ... ) {
    FD_ZERO(&rfds);
    FD_SET(s, &rfds);

    // возвращает количество произошедших событий 
    int event_count = select( <списки дескрипторов> );
    if ( FD_ISSET(s, &rfds) ) {
        // тут accept
    }
}

А вообще читать до просветления Уильяма Стивенса «UNIX: разработка сетевых приложений» хоть и писалась давно, но базовые вещи не изменились.

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