как работает функция sendto

Тема в разделе "WASM.WIN32", создана пользователем epxcn, 13 апр 2006.

  1. epxcn

    epxcn New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    3
    Адрес:
    Ukraine
    Функция sendto в блокирующем режиме не возвращается до тех пор, пока не будут переданы данные. А как эта функция узнаёт, что данные переданы?
     
  2. HitmaN85

    HitmaN85 New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2005
    Сообщения:
    36
    А кто сказал что она так работает?

    Если вы попытаетесь sendto оправить что-нить через TCP сокет, то sendto проигнорирует два последних параметра и отработает как send
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    epxcn



    Она получит подтверждение через TCP.
     
  4. epxcn

    epxcn New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    3
    Адрес:
    Ukraine
    В данном случае, я хочу узнать об UDP сокетах, а точнее как sendto узнаёт о том что данные были получены другой стороной, получает подтверждение по UDP? если можно по подробнее.
     
  5. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    В случае UDP нет никаких подтверждений. sendto просто формирует пакет, отсылает его в сеть и сразу возвращает управление.
     
  6. HitmaN85

    HitmaN85 New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2005
    Сообщения:
    36
    sendto возвращает управление, когда сетевой адаптер отправил данные, а не тогда, когда они попали в буфер.
     
  7. epxcn

    epxcn New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    3
    Адрес:
    Ukraine
    Ms Rem "... и сразу возвращает управление."



    MSDN "If no buffer space is available within the transport system to hold the data to be transmitted, sendto will block unless the socket has been placed in a nonblocking mode."



    Наверное я не так задал вопрос и вы не можете понять что меня интересует.



    Вариант 1: компьютер1 вызывает recvfrom, компьютер2 вызывает sendto, компьютер1 получает данные переданные функцией sendto, функция sendto успешно возвращается, eax содержит количество переданных байт.



    Вариант 2: компьютер1 принимает пакеты с помощью драйвера NDIS, компьютер2 вызывает sendto, компьютер1 получает пакет с данными переданными sendto, но функция sendto (в blocking mode) при этом не возвращается.



    Как сделать так чтобы во втором варианте, функция sendto так же успешно возвратилась как и в первом?
     
  8. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    epxcn тебе сказано, что UDP протокол не позволяет узнать получены ли данные другой стороной (они вобще могут потеряться и никто не узнает). Если не вериться - читай RFC.
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    epxcn

    В той цитате из MSDN ясно же сказано, что в неблокирующем режиме она вернёт управление сразу, даже если данные ещё не покинули сетевуху, а об успешном принятии этих самых данных и говорить не приходится, т.к. это UDP. Данные могут потеряться, исказиться и даже прийти в нескольких экземплярах, если между к1 и к2 есть более одной траектории.