我想从将数据发送到我的电脑通过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;
我究竟做错了什么?
提前致谢
基思·米勒说,你是滥用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;