2015-10-19 4 views
1

Мое приложение постоянно отправляет пакеты UDP на разные хосты. Когда хост жив, пакет UDP достигает узла, а функция sendto возвращает количество отправленных ему байтов. Но когда хост получает (отсоединение кабеля или сброс), функция sendto не отправляет пакет UDP, а возвращает количество байтов в буфере. Вместо отправки пакетов UDP пакеты ARP отправляются для поиска узла. Почему функция sendto не возвращает SOCKET_ERROR? WSAGetLastError функция возврат 0 тоже. Как я могу заметить ошибку при отправке пакетов UDP на недоступный хост?UDP sendto никогда не сработает

P.S. моя ОС - Winodws 7 x64, а мое приложение является родным C++ и 64-разрядным.

+0

Каковы случаи отказа, которые вы пробовали? просто отсоедините кабель? – lsbbo

+0

К моменту обнаружения ошибки, слишком поздно возвращать что-либо. –

ответ

7

Название вашего вопроса - «UDP sendto никогда не сработает» - это довольно хорошее однострочное резюме UDP.

Как работает UDP - UDP не заботится о достижении цели.
UDP sendto «преуспевает», когда пакет покидает ваше приложение; вам даже не нужно оставлять компьютер до UDP.

Пакеты ARP - это попытки вашего компьютера найти способ добраться до хоста, но в этот момент sendto уже «преуспел».

Если вы хотите надежный протокол, UDP - это не то, что вы ищете.

+0

Вы правы, но есть ли способ узнать, что мой пакет не покидал компьютер, и моя ОС пытается найти хост, отправив ARP-пакеты? –

+0

@MustafaChelik Я сомневаюсь, что есть, но может быть что-то конкретное Windows, которое вы могли бы использовать вместо сокетов. Использование протокола, который соответствует вашей цели, или реализации одного поверх UDP, может быть лучшей идеей. – molbdnilo

0

UDP sendto() не может возвращать ошибку такого характера, если вы не отправляете через подключенный UDP-сокет, и в этом случае вы можете получить сообщение об ошибке при последующей отправке.

Смежные вопросы