Должен ли я использовать AcceptEx() или WSAAccept()?

Я использую Overlapped IO, я хочу принимать клиентские соединения, используя блокирующий вызов, так же, как я делаю с обычным accept(), Я не уверен но думаю что AcceptEx() не блокирует, пока WSAAccept() делает. Так и есть WSAAccept() похожий на accept()?

2 ответа

Решение

accept() а также WSAAccept() оба будут блокироваться, если вы не использовали ioctlsocket установить слушателя в неблокирующий режим. Таким образом, вы можете использовать любой из них, чтобы принять клиента во время блокировки.

Однако вы получите больше контроля, если вы используете WSAEventSelect зарегистрировать событие против FD_ACCEPT на вашем слушателе. Ваше событие будет установлено, когда клиент будет готов к приему без блокировки.

Затем вы можете объединить это событие, скажем, с таймаутом или другим событием, которое вы можете сигнализировать, если хотите отменить прослушивание (например, при выходе из приложения) при вызове WaitForMultipleObjectsEx,

Почему вы хотите использовать блокирующий вызов?

Если вы используете порты завершения ввода / вывода, то лучший способ установить соединение - это использовать AcceptEx() и не ждать данных вместе с подключением. Причина этого заключается в том, что с помощью AcceptEx() означает, что вам не нужен отдельный поток для установления соединения (т. е. обычный "цикл приема"), который уменьшает ненужные переключения контекста.

Опция "принять и прочитать данные" AcceptEx() может открыть вас для атаки типа "отказ в обслуживании", если соединения соединяются и не отправляют данные, и от этого трудно защититься, если вы не добавите служебный поток, который отрицает цель использования AcceptEx() на первом месте...

Другие вопросы по тегам