Вы не можете ждать непосредственно на ручках сокетов.
WSAAccept()
является синхронным, единственный способ прервать его - закрыть гнездо для прослушивания.
Для того, что вы пытаетесь сделать, вместо этого используйте AcceptEx()
, который является асинхронным и поддерживает операции перекрытия ввода-вывода и ввода-вывода ввода-вывода.
Если вы используете Overlapped I/O, вы можете связать стандартный объект события Win32 для каждого Overlapped I/O способны гнезда (AcceptEx()
, WSARecv()
, WSASend()
и т.д.), а также использовать стандартный объект события Win32 для остановки события , И затем вы можете использовать цикл WaitForMultipleObjects()
, чтобы узнать, какое событие (ы) сигнализируется и действует соответствующим образом.
Если вы используете порт завершения ввода-вывода, вам вообще не нужны объекты событий. Вы можете связать каждый сокет с одной очередью IOCP, и ваш обработчик IOCP (либо вызов GetQueuedCompletionStatus()
, либо функция обратного вызова) будет уведомляться всякий раз, когда завершается каждая операция сокета IOCP. Затем вы можете использовать PostQueuedCompletionStatus()
для отправки пользовательского сообщения остановки в очередь IOCP. Ваш обработчик IOCP может действовать соответствующим образом, исходя из того, какое событие он получает.
вам нужно использовать [AcceptEx] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms737524 (v = vs.85) .aspx) вместо 'WSAAccept' - этот апикс асинхронный , вам не нужно ждать на нем вообще. если вы связываете сокет (второй параметр) с IOCP - вы получили обратный вызов, когда соединение завершено – RbMm