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
,
(Тем не менее, правильный порядок получения пакетов от одного и того же удаленного хоста не гарантирован, но сейчас это не моя цель).