вопрос о событиях FD_RECV FD_SEND

Тема в разделе "WASM.NETWORKS", создана пользователем XshStasX, 7 сен 2010.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Правильно ли я понимаю смысл этих сообщений:

    FD_RECV - Получает окно когда пришли данные для чтения, то есть физически данные уже получены и хранятся где то в памяти?

    FD_SEND - данные отправлены. Означает ли это что другой комп. в сети эти данные получил ?
     
  2. SoftCreator

    SoftCreator New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2010
    Сообщения:
    36
    FD_RECV - буфер для чтения не пуст и готов к чтению. Сколько именно удалось считать, скажет recv\WSARecv
    FD_SEND - буфер для записи не полон и готов к вызову send/WSASend, который и скажет, сколько байт удалось отправить до заполнения буфера.
    P.S. Все мучаете LSP? Как успехи?
     
  3. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Блин перепутал
    FD_RECV c FD_READ
    FD_SEND c FD_WRITE

    для FD_READ, FD_WRITE мои рассуждения правильны ?

    SoftCreator
    В целом продвигаются, хотя есть не понятные моменты но они просветляются )

    П.С интересно что этого в течении нескольких часов не замечал, а вот сейчас раз и просвещение )
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Я то думал откуда он взял эти коды. Читаем msdn.
    FD_READ Socket s ready for reading.
    FD_WRITE Socket s ready for writing.
     
  5. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Сокет готов для чтения?
    Сокет готов для записи?

    англ. знаю плохо по этому не уверен в корректности перевода.
    в мсдн вот что нашол:
    FD_WRITЕ - Issues notification of readiness for writing
    FD_READ  - Issues notification of readiness for reading.

    Мож кто сообщит тайну этих слов, переводчик это не переваривает(.
     
  6. SoftCreator

    SoftCreator New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2010
    Сообщения:
    36
    Все то, что я написал, как раз для них и есть :)
    Я просто не помнил их точное название.
    Нужно это вот для чего:
    - если Вы получили FD_READ, значит, Вы можете вызвать recv и считать хотя бы один байт
    - если Вы получили FD_WRITE, значит, Вы можете вызвать send и передать хотя бы один байт
    Если это делать, не получая таких сообщений, на неблокирующих сокетах получаем пустую трату процессорного времени; если бы такое делали на блокирующих (в теории, конечно, т.к. FD_XXXX придут только для неблокирующего сокета) - подвисание.
    P.S. И еще - если пришло FD_READ и вызван recv, который считал не все данные, придет еще один FD_READ.
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    XshStasX
    А до конца просмотреть WSAAsyncSelect поленился ? Там в конце перечислены все конкретные условия при которых генерируются эти сообщения. В частности FD_WRITE шлется в случаях, когда возможен вызов send или sendto, а именно 1) после вызова самого WSAAsyncSelect, 2) после установки соединения через connect или accept, 3) после снятия блокировки передачи, если предыдущий send завершился с ошибкой WSAEWOULDBLOCK
     
  8. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    В если сделан recv(buf,50,0) хотя реально на компе только 20байт имеется данных.
    тоесть за первый запрос мы считаем 20 байт, потом когда придут данные нам придет сообщение FD_READ и мы опять считаем данные , так ?
    Или же эти недостающие данные будут считаны автоматом а нам придет только извещение FD_READ ??

    И еще если мы просто получаем данные с флагом MSG_PEEK, эти данные как можно еще сбросить с буфера ?
     
  9. SoftCreator

    SoftCreator New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2010
    Сообщения:
    36
    Совершенно верно

    Считать еще раз, но уже без этого флага