与TIdUDPServer读数据(Reading data with TIdUDPServer)

2019-07-29 09:31发布

我想从将数据发送到我的电脑通过UDP的电子设备读取数据。 我已经在编程德尔福UDP服务器。 类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;

我究竟做错了什么?

提前致谢

Answer 1:

基思·米勒说,你是滥用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上运行-该设备将发送UDP数据包的IP。 您可以绑定到一个通配符IP 0.0.0.0 (或只是一个空字符串“”),它告诉TIdUDPServer绑定到所有可用的IP地址本地:

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

或者你可以使用Indy的GStack.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让OS选择一个端口,你可以发现,通过在寻找选择哪个端口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;


文章来源: Reading data with TIdUDPServer