Должен ли я использовать AcceptEx() или WSAAccept()?
Я использую Overlapped IO, я хочу принимать клиентские соединения, используя блокирующий вызов, так же, как я делаю с обычным accept()
, Я не уверен но думаю что AcceptEx()
не блокирует, пока WSAAccept()
делает. Так и есть WSAAccept()
похожий на accept()
?
2 ответа
accept()
а также WSAAccept()
оба будут блокироваться, если вы не использовали ioctlsocket
установить слушателя в неблокирующий режим. Таким образом, вы можете использовать любой из них, чтобы принять клиента во время блокировки.
Однако вы получите больше контроля, если вы используете WSAEventSelect
зарегистрировать событие против FD_ACCEPT
на вашем слушателе. Ваше событие будет установлено, когда клиент будет готов к приему без блокировки.
Затем вы можете объединить это событие, скажем, с таймаутом или другим событием, которое вы можете сигнализировать, если хотите отменить прослушивание (например, при выходе из приложения) при вызове WaitForMultipleObjectsEx
,
Почему вы хотите использовать блокирующий вызов?
Если вы используете порты завершения ввода / вывода, то лучший способ установить соединение - это использовать AcceptEx()
и не ждать данных вместе с подключением. Причина этого заключается в том, что с помощью AcceptEx()
означает, что вам не нужен отдельный поток для установления соединения (т. е. обычный "цикл приема"), который уменьшает ненужные переключения контекста.
Опция "принять и прочитать данные" AcceptEx()
может открыть вас для атаки типа "отказ в обслуживании", если соединения соединяются и не отправляют данные, и от этого трудно защититься, если вы не добавите служебный поток, который отрицает цель использования AcceptEx()
на первом месте...