Вопрос по – Чтение данных с помощью TIdUDPServer

0

Я хотел бы прочитать данные с электронного устройства, которое отправляет данные на мой компьютер по протоколу UDP. Я запрограммировал сервер UDP в Delphi. Исключение происходит в классе EIdSocketError (Ошибка # 10049). Вот мой код:

procedure TForm1.Button1Click(Sender: TObject);
begin
   IdUDPServer1.Bindings.add.IP := '192.168.1.1';  //Electronic device ip
   IdUDPServer1.Bindings.add.Port:= 49152;         //Electronic device port   
   IdUDPServer1.OnUDPRead:= UDPRead;
   IdUDPServer1.Active:=True;

end;

procedure TForm1.UDPRead (Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
   bytes_received: integer;
begin
   bytes_received:=AData.size;
end;

Что я делаю не так

Заранее спасиб

Я думаю, вам нужно присвоить результат IdUDPServer1.Bindings.add переменной, а затем установить его IP-адрес и порт. Если я правильно помню, вы добавляете две привязки, одну с IP и одну с портом. Keith Miller
Нет, с помощью Bindings вы можете указать, какой адаптер Ethernet вы слушаете для пакетов UDP. whosrdaddy
Я изменил код следующим образом, но ошибка та же ... Я предполагаю, что ip привязки должен быть ip электронного устройства (а не ip ПК):var myaddress: TIdSocketHandle; начать мой адрес: = IdUDPServer1.Bindings.Add; myaddress.IP: = '192.168.1.1'; myaddress.Port: = 49152; IdUDPServer1.Bindings.Add.IP: = myaddress.IP; IdUDPServer1.Bindings.Add.Port: = myaddress.Port; конец user1361263
Пожалуйста, обновите ваш вопрос, используя последний код, который вы используете. Remy Lebeau
Я изменил IP-адрес привязки на «0.0.0.0» (а также «127.0.0.1»), но я продолжаю получать данные с внешнего устройства ... Есть ли ошибка в моем коде? user1361263

Ваш Ответ

1   ответ
5

Как сказал Кит Миллер, вы неправильно используетеBindings свойство. Вы добавляете2 привязки к серверу - одна для192.168.1.1 в порту0 и еще один для0.0.0.0 в порту49152. Вам нужно позвонитьBindings.Add() только один раз для каждой пары IP / порт, с которой вы хотите связать, например:

var
  Binding: TIdSocketHandle

Binding := IdUDPServer1.Bindings.Add;
Binding.IP := ...;
Binding.Port := ...;

Или

with IdUDPServer1.Bindings.Add do
begin
  IP := ...;
  Port := ...;
end;

Если вы установитеDefaultPort свойство заранее, тогда вы можете упростить вышесказанное до этого:

IdUDPServer1.DefaultPort := ...;
IdUDPServer1.Bindings.Add.IP := ...;

При этом ошибка сокета 10049 равнаWSAEADDRNOTAVAIL, что означает, что вы в первую очередь используете неправильный IP-адрес. Вам необходимо указать IP, принадлежащий ПК, которыйTIdUDPServer работает - IP-адрес, на который устройство будет отправлять UDP-пакеты. Вы можете связать с одним подстановочным IP-адресом0.0.0.0 (или просто пустая строка ''), которая говоритTIdUDPServer для привязки ко всем доступным локальным IP-адресам:

IdUDPServer1.DefaultPort := ...;
IdUDPServer1.Bindings.Add.IP := ''; // or: '0.0.0.0' 

Или ты можешь использовать Indy'sGStack.LocalAddresses свойство для определения локально доступных IP-адресов и создания отдельныхBindings для них индивидуально по мере необходимости.

IdUDPServer1.Bindings.Clear;
IdUDPServer1.DefaultPort := ...;

with GStack.LocalAddresses do
begin
  for I := 0 to Count-1 do
    IdUDPServer1.Bindings.Add.IP := Strings[I];
end;

Обновить если вы привязали сервер к порту 0, чтобы ОС могла выбрать порт, вы можете узнать, какой порт был выбран, посмотрев наTIdSocketHandle.Port свойство после активации сервера:

var
  Binding: TIdSocketHandle
  ListeningPort: TIdPort;

IdUDPServer1.Bindings.Clear;

Binding := IdUDPServer1.Bindings.Add;
Binding.IP := ...;
Binding.Port := 0;
{
or: 
IdUDPServer1.DefaultPort := 0;
Binding := IdUDPServer1.Bindings.Add;
Binding.IP := ...;
}

IdUDPServer1.Active := True;

ListeningPort := Binding.Port;
Я внесу изменения в свой код и покажу вам свои результаты user1361263
еременная @Gstack может быть распознана в моем Delphi 7 ... user1361263
ВключитеIdStack unit в вашем предложении использования. Remy Lebeau

Похожие вопросы