Следует ли использовать WSASocket() с IOCP?

Я знаю, что рекомендуется использовать WSAAccept() вместо accept() при создании приложения IOCP. Но я не уверен, относится ли WSASocket() к функциям перекрывающегося ввода-вывода или это просто еще одна функция Winsock?


person Community    schedule 09.03.2015    source источник


Ответы (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
comment
Фактически, документация для socket() говорит: Создаваемый сокет будет иметь атрибут перекрытия по умолчанию. - person ; 09.03.2015
comment
Имеет ли это. Я никогда этого не замечал. Спасибо, что сказал мне! я поправил ответ - person Len Holgate; 09.03.2015
comment
Таким образом, не существует такой вещи, как функции, которые относятся только к перекрывающемуся вводу-выводу, а есть функции WSAxxx(), которые можно использовать для перекрывающегося ввода-вывода, но также можно использовать и для неперекрывающегося ввода-вывода. И есть функции berkeley/POSIX, которые не поддерживают перекрывающийся ввод-вывод. Верно ли мое предположение? - person ; 10.03.2015
comment
Сокет должен быть создан с правильным установленным флагом, чтобы его можно было использовать с перекрывающимися функциями ввода-вывода таким образом, чтобы возникал перекрывающийся ввод-вывод. Вы можете создать сокет без флага перекрытия и передать его в WSASend() и использовать его для синхронной отправки без перекрытия. Точно так же вы можете передать сокет С флагом перекрытия, установленным в WSASend(), а также запросить синхронную отправку, а не перекрывающуюся отправку. Чего вы не можете сделать, так это передать сокет без установленного флага и запросить перекрывающуюся отправку. Функции POSIX не поддерживают перекрывающийся ввод-вывод и IOCP, поскольку это концепции только для Windows. - person Len Holgate; 10.03.2015