Неблокирующий сокет. Прочитать данные

Тема в разделе "WASM.NETWORKS", создана пользователем psu, 31 май 2007.

  1. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    recv возвращает -1 и errno == EINPROGRESS
    вызываю select, данные приходят
    теперь снова recv? Может ли снова произойти то же самое?
    В общем, как правильно считать данные из неблокирующего сокета?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ээ ну насколько я понял попробуй снова select вызвать=\ судя по её описанию в msdn. сам я с неблокирующими сокетами не работал
     
  3. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    Экспериментирую сижу.. неблокирующим делаю сокет только для connect()
    т.е
    Код (Text):
    1. fcntl( sock, F_SETFL, O_NONBLOCK | ( rc_old = fcntl( sock, F_GETFL, 0 ) ) );
    2. if( connect( sock, ( const struct sockaddr* )&saddr, sizeof( saddr ) ) == 0
    3.     || ( errno == EINPROGRESS && SocketReady( sock, SWRITE ) ) )
    4. {
    5. fcntl( sock, F_SETFL, rc_old );
    6. ...
    ( SocketReady - моя обвертка select, SWRITE - флаг ожидания сокета для записи )

    Далее посылка и прием данных
    Код (Text):
    1. if( send( sock, req, len, 0 ) > 0 )
    2. {
    3.         if( recv( sock, buf, MAX_BUF_SIZE, 0 ) > 0 )
    4.         {
    5. ...
    recv возвращает -1 и errno == EINPROGRESS
    Как такое может быть? Сокет ведь не блокирующий, почему он не ожидает завершения приема данных?
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    MSG_PEEK?
     
  5. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    а что возвращает вызов fcntl(sock, F_SETFL, rc_old)?
     
  6. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    Проблему решил. Вызов select должен идти до recv ( это касательно неблокирующего сокета )
    А вот с проблемой EINPROGRESS == recv() c блокирующим сокетом нет времени разобраться. Если кто-нибудь разберется при случае - отпишитесь плз.
    Всем спасибо
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    psu
    Логично:
    .
    Сначала узнаёшь состояние сокета, потом читаешь, если что-то пришло.
     
  8. _Raven

    _Raven New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2006
    Сообщения:
    34
    А у меня было такое, что recv возвращал -1, а данные все равно приходили:)
    Причем небл. режим был включен WSAEventSelect.