Если мне нужно было бы использовать модель ввода/вывода, основанную на сообщениях окна (WSAAsyncSelect()), либо же на событиях (WSAWaitForMultipleEvents()), то мне бы пришлось переводить сокет в асинхронный режим через setsockopt(), либо сразу создавать сокет через WSASocket() с параметром WSA_FLAG_OVERLAPPED. После этого я мог бы вызвать connect() и проверить результат. Если код ошибки WSAEWOULDBLOCK, то жду когда придёт сообщение в окно, или же возникнет событие (всё зависит от выбранной модели ввода/вывода).
А вот если я использую модель ввода/вывода, основанную на портах завершения ввода/вывода, тогда как мне использовать функцию connect()? По идее в порт завершения ввода/вывода она ничего не должна записывать, так как в ней нет параметра с указателем на WSAOVERLAPPED. Следовательно функция всегда будет блокируемой и никогда не вернёт WSAEWOULDBLOCK?
Re: Запутался с функцией connect() для не блокирующих сокето
Здравствуйте, s3dworld, Вы писали:
S>Если мне нужно было бы использовать модель ввода/вывода, основанную на сообщениях окна (WSAAsyncSelect()), либо же на событиях (WSAWaitForMultipleEvents()), то мне бы пришлось переводить сокет в асинхронный режим через setsockopt(),
Нет, не надо, WSAAsyncSelect сама все переводит. И не setsockopt, а ioctlsocket(FIONBIO).
S>либо сразу создавать сокет через WSASocket() с параметром WSA_FLAG_OVERLAPPED.
OVERLAPPED не имеет отношения к WSAAsyncSelect/WSAEventSelect, это не то же самое что nonblocking mode.
И флаг OVERLAPPED на сокете установлен, если ты его создаешь через обычный вызов socket, для этого не надо обязательно вызывать WSASocket(WSA_FLAG_OVERLAPPED).
S>После этого я мог бы вызвать connect() и проверить результат. Если код ошибки WSAEWOULDBLOCK, то жду когда придёт сообщение в окно, или же возникнет событие (всё зависит от выбранной модели ввода/вывода).
Да.
S>А вот если я использую модель ввода/вывода, основанную на портах завершения ввода/вывода, тогда как мне использовать функцию connect()?
Начиная с Windows XP/2003 с IOCP можно использовать ConnectEx.
Re[2]: Запутался с функцией connect() для не блокирующих сок
> Начиная с Windows XP/2003 с IOCP можно использовать ConnectEx.
То есть, ConnectEx() не блокируемая функция и всегда будет уведомлять в порт о завершении своей работы?
Re[3]: Запутался с функцией connect() для не блокирующих сок