Функция sendto в блокирующем режиме не возвращается до тех пор, пока не будут переданы данные. А как эта функция узнаёт, что данные переданы?
А кто сказал что она так работает? Если вы попытаетесь sendto оправить что-нить через TCP сокет, то sendto проигнорирует два последних параметра и отработает как send
В данном случае, я хочу узнать об UDP сокетах, а точнее как sendto узнаёт о том что данные были получены другой стороной, получает подтверждение по UDP? если можно по подробнее.
В случае UDP нет никаких подтверждений. sendto просто формирует пакет, отсылает его в сеть и сразу возвращает управление.
sendto возвращает управление, когда сетевой адаптер отправил данные, а не тогда, когда они попали в буфер.
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 так же успешно возвратилась как и в первом?
epxcn тебе сказано, что UDP протокол не позволяет узнать получены ли данные другой стороной (они вобще могут потеряться и никто не узнает). Если не вериться - читай RFC.
epxcn В той цитате из MSDN ясно же сказано, что в неблокирующем режиме она вернёт управление сразу, даже если данные ещё не покинули сетевуху, а об успешном принятии этих самых данных и говорить не приходится, т.к. это UDP. Данные могут потеряться, исказиться и даже прийти в нескольких экземплярах, если между к1 и к2 есть более одной траектории.