Запутался с функцией connect() для не блокирующих сокетов

Тема в разделе "WASM.NETWORKS", создана пользователем s3dworld, 10 сен 2011.

  1. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Всем доброго дня!

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

    А вот если я использую модель ввода/вывода, основанную на портах завершения ввода/вывода, тогда как мне использовать функцию connect()? По идее в порт завершения ввода/вывода она ничего не должна записывать, так как в ней нет параметра с указателем на WSAOVERLAPPED. Следовательно функция всегда будет блокируемой и никогда не вернёт WSAEWOULDBLOCK?
     
  2. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    При удачном завершении ф-ции connect сокет станет доступным для записи. Думаю, что нужно изыскать возможность узнать об этом. На линуксах это раелизуется имменно так (epoll и пр.).
     
  3. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Aspire
    Так то так, а вдруг сокет открыт только для чтения.
     
  4. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    s3dworld, ну проверьте на доступность для чтения ))