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

Discussion in 'WASM.WIN32' started by epxcn, Apr 13, 2006.

  1. epxcn

    epxcn New Member

    Blog Posts:
    0
    Joined:
    Jan 5, 2006
    Messages:
    3
    Location:
    Ukraine
    Функция sendto в блокирующем режиме не возвращается до тех пор, пока не будут переданы данные. А как эта функция узнаёт, что данные переданы?
     
  2. HitmaN85

    HitmaN85 New Member

    Blog Posts:
    0
    Joined:
    Oct 6, 2005
    Messages:
    36
    А кто сказал что она так работает?

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

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

    Blog Posts:
    0
    Joined:
    Jan 6, 2003
    Messages:
    3,143
    Location:
    Ukraine
    epxcn



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

    epxcn New Member

    Blog Posts:
    0
    Joined:
    Jan 5, 2006
    Messages:
    3
    Location:
    Ukraine
    В данном случае, я хочу узнать об UDP сокетах, а точнее как sendto узнаёт о том что данные были получены другой стороной, получает подтверждение по UDP? если можно по подробнее.
     
  5. Ms Rem

    Ms Rem New Member

    Blog Posts:
    0
    Joined:
    Apr 17, 2005
    Messages:
    1,057
    Location:
    С планеты "Земля"
    В случае UDP нет никаких подтверждений. sendto просто формирует пакет, отсылает его в сеть и сразу возвращает управление.
     
  6. HitmaN85

    HitmaN85 New Member

    Blog Posts:
    0
    Joined:
    Oct 6, 2005
    Messages:
    36
    sendto возвращает управление, когда сетевой адаптер отправил данные, а не тогда, когда они попали в буфер.
     
  7. epxcn

    epxcn New Member

    Blog Posts:
    0
    Joined:
    Jan 5, 2006
    Messages:
    3
    Location:
    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

    Blog Posts:
    0
    Joined:
    Apr 17, 2005
    Messages:
    1,057
    Location:
    С планеты "Земля"
    epxcn тебе сказано, что UDP протокол не позволяет узнать получены ли данные другой стороной (они вобще могут потеряться и никто не узнает). Если не вериться - читай RFC.
     
  9. Quantum

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

    Blog Posts:
    0
    Joined:
    Jan 6, 2003
    Messages:
    3,143
    Location:
    Ukraine
    epxcn

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