darkelf, да, можно.
WSACreateEvent -- создаёшь событие (объект Win32),
WSAEventSelect -- привязываешь событие к некоторому сетевому событию (коннект, прибытие данные, ...) на заданном сокете.
После WSAEventSelect событие будет переходить в состояние signalled, при соответствующих сетевых событиях.
WSAEVENT accept_event;
accept_event = WSACreateEvent();
if ( WSA_INVALID_EVENT == accept_event )
{
// error
}
if ( 0!= WSAEventSelect( s, accept_event, FD_ACCEPT ) )
{
// error
}
// ...
while ( 1 ) {
wait_res = WaitForMultipleObjects( 1, & accept_event, FALSE, 500 );
// ...
}
Тут есть одна засада. Как показывает практика, вызов операции с сокетом (accept, например) не всегда сбрасывает событие. Это приводит к тому, что событие обработано, подключение сделано, но событие висит и WaitForMultipleObjects срабатывает, хотя в сети ничего не происходит. Это можно побороть, если после операции руками сбрасывать событие WSAResetEvent
sock = accept( ... );
WSAResetEvent( accept_event );