Indy IdUDPClient.sendbuffer - ложные данные в приемном буфере

Я посылаю UDP-пакеты, используя компонент IdUDPClient в Indy:

FIdUDPclient.sendbuffer( AIP, APort, FIdUDPBuffer );
Frecl := FIdUDPclient.receivebuffer( FIdRecBuff, FreceiveTimeout );

Сразу после получения ответа.

Использование wireshark при отладке кода показало, что иногда receivebuffer FIdRecBuff содержит неожиданные данные.

Например, полученные байты читают с помощью Wireshark:
45 02 57 00
Но во время отладки FIdRecBuff:
45 02 57 02

Приведенный выше код выполняется в рабочем потоке с одним выделенным экземпляром IdUDPClient. Я отправляю только те же 3 байта и получаю 4 байта в качестве ответа от каждого из трех IP-устройств.

Я думал, что проблема в том, что я отправляю UDP-пакеты для трех разных IP-устройств без задержки, поэтому ответы с IP-адресов не в порядке. Но индийский метод sendbuffer() блокируется до получения, поэтому я не понимаю.

Может кто-нибудь объяснить, какие сценарии / условия могут привести к такому поведению?

1 ответ

Решение

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

Для разделения полученных пакетов по удаленным хостам возможны следующие решения (спасибо Реми Лебо):

  • Проверка полученных пакетов на наличие удаленного IP-адреса, соответствующего отправленному пакету.
  • Подключите IdUDPClient к удаленному IP. (IdUDPClient.binding затем IdUDPClient.Connect)
  • Использование IdUDPServer для отправки пакетов, чтение ответов в обработчике событий OnUDPRead,

(Тем не менее, правильный порядок получения пакетов от одного и того же удаленного хоста не гарантирован, но сейчас это не моя цель).

Другие вопросы по тегам