Запутался с функцией connect() для не блокирующих сокетов
От: s3dworld Россия  
Дата: 10.09.11 09:08
Оценка:
Всем доброго дня!

Если мне нужно было бы использовать модель ввода/вывода, основанную на сообщениях окна (WSAAsyncSelect()), либо же на событиях (WSAWaitForMultipleEvents()), то мне бы пришлось переводить сокет в асинхронный режим через setsockopt(), либо сразу создавать сокет через WSASocket() с параметром WSA_FLAG_OVERLAPPED. После этого я мог бы вызвать connect() и проверить результат. Если код ошибки WSAEWOULDBLOCK, то жду когда придёт сообщение в окно, или же возникнет событие (всё зависит от выбранной модели ввода/вывода).

А вот если я использую модель ввода/вывода, основанную на портах завершения ввода/вывода, тогда как мне использовать функцию connect()? По идее в порт завершения ввода/вывода она ничего не должна записывать, так как в ней нет параметра с указателем на WSAOVERLAPPED. Следовательно функция всегда будет блокируемой и никогда не вернёт WSAEWOULDBLOCK?
Re: Запутался с функцией connect() для не блокирующих сокето
От: Michael Chelnokov Украина  
Дата: 10.09.11 12:17
Оценка: 6 (1)
Здравствуйте, 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() для не блокирующих сок
От: s3dworld Россия  
Дата: 12.09.11 10:01
Оценка:
> Начиная с Windows XP/2003 с IOCP можно использовать ConnectEx.
То есть, ConnectEx() не блокируемая функция и всегда будет уведомлять в порт о завершении своей работы?
Re[3]: Запутался с функцией connect() для не блокирующих сок
От: Michael Chelnokov Украина  
Дата: 12.09.11 17:42
Оценка:
Здравствуйте, s3dworld, Вы писали:

S>То есть, ConnectEx() не блокируемая функция и всегда будет уведомлять в порт о завершении своей работы?


Смысла вопроса не понял, но да.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.