Я знаю, что рекомендуется использовать WSAAccept()
вместо accept()
при создании приложения IOCP. Но я не уверен, относится ли WSASocket()
к функциям перекрывающегося ввода-вывода или это просто еще одна функция Winsock?
Следует ли использовать WSASocket() с IOCP?
Ответы (1)
Я всегда думал, что вы можете ответить на этот вопрос, просмотрев документы MSDN для socket()
и WSASocket()
и, в частности, что вы не можете создать сокет, который можно использовать с перекрывающимся вводом-выводом (и IOCP), используя socket()
, так как только WSASocket()
позволяет указать флаг WSA_FLAG_OVERLAPPED
, когда вы создаете сокет. Но это неверно, так как socket()
создает сокеты с установленным WSA_FLAG_OVERLAPPED
.
Однако, как правило, функции сокетов berkeley/POSIX в Windows существуют только для удобства людей, которые хотят программировать для этого API. Существует очень мало причин для их использования, и следует отдавать предпочтение собственным API-интерфейсам Windows.
person
Len Holgate
schedule
09.03.2015
Фактически, документация для
socket()
говорит: Создаваемый сокет будет иметь атрибут перекрытия по умолчанию.
- person ; 09.03.2015
Имеет ли это. Я никогда этого не замечал. Спасибо, что сказал мне! я поправил ответ
- person Len Holgate; 09.03.2015
Таким образом, не существует такой вещи, как функции, которые относятся только к перекрывающемуся вводу-выводу, а есть функции
WSAxxx()
, которые можно использовать для перекрывающегося ввода-вывода, но также можно использовать и для неперекрывающегося ввода-вывода. И есть функции berkeley/POSIX, которые не поддерживают перекрывающийся ввод-вывод. Верно ли мое предположение?
- person ; 10.03.2015
Сокет должен быть создан с правильным установленным флагом, чтобы его можно было использовать с перекрывающимися функциями ввода-вывода таким образом, чтобы возникал перекрывающийся ввод-вывод. Вы можете создать сокет без флага перекрытия и передать его в WSASend() и использовать его для синхронной отправки без перекрытия. Точно так же вы можете передать сокет С флагом перекрытия, установленным в WSASend(), а также запросить синхронную отправку, а не перекрывающуюся отправку. Чего вы не можете сделать, так это передать сокет без установленного флага и запросить перекрывающуюся отправку. Функции POSIX не поддерживают перекрывающийся ввод-вывод и IOCP, поскольку это концепции только для Windows.
- person Len Holgate; 10.03.2015