Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > socket (accept)


Автор: fantast 25.5.2007, 20:46
привет всем. вопрос в том, как мне изменить свойства  accept так, чтобы он не ждал (если очередь пуста) когда ктонить обратится к серверу с запросом, а сразу выдовал, что желающих нету.
спасибо

Автор: dumb 26.5.2007, 11:25
перевести сокет в неблокирующий режим(nonblocking mode).
Код

int block = 1;
ioctlsocket(s, FIONBIO, &block);


только нужно иметь ввиду, что изменится не только работа accept, но и работа всех остальных функций.

Автор: fantast 26.5.2007, 20:44
супер, спасибо

Автор: GremlinProg 26.5.2007, 22:43
можно и не отключать блокировку (иногда без неё муторно...), используем функцию WSAEventSelect, которая ассоциирует объект ожидания WSAEVENT с необходимым сигналом, в том числе и FD_ACCEPT. Чтобы проверить, сработало ли событие исполльзуем WSAWaitForMultipleEvents с dwTimeout = 0. Только здесь, в отличии от обычных событий (CreateEvent) нельзя создать событие-автомат (может и можно, не нашел), которое само сбрасывается после отработки, т.е. нужно самим его сбрасывать (WSAResetEvent)

Автор: dumb 27.5.2007, 04:22
GremlinProg, smile
Цитата(msdn)

The WSAAsyncSelect and WSAEventSelect functions automatically set a socket to nonblocking mode. If WSAAsyncSelect or WSAEventSelect has been issued on a socket, then any attempt to use ioctlsocket to set the socket back to blocking mode will fail with WSAEINVAL.

Автор: GremlinProg 27.5.2007, 12:39
да, dumb, действительно, на слушающем сокете мы из него обычно не читаем, поэтому и проблем нету. Но на клиентском сокете - и читаем и пишем. Правда к accept это не имеет отношения, тем не менее, для полноты изложения надо дополнить
Цитата

To set the socket back to blocking mode, an application must first disable WSAAsyncSelect by calling WSAAsyncSelect with the lEvent parameter equal to zero, or disable WSAEventSelect by calling WSAEventSelect with the lNetworkEvents parameter equal to zero.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)