最近我制作了一个非常小巧,非常轻便的应用程序,它使用两个UDP客户端和两个UDP服务器组件。除了几个功能外,它基本上没有任何其他功能。 我被困了一段时间“无法绑定套接字。地址和端口已经在使用”,但不知何故通过更改端口,使用重用套接字上的rsTrue属性解决了这个问题,但不知何故,几个用户在尝试运行时仍然遇到错误来自应用程序的连接。
服务器和客户端必须使用相同的端口和相同的地址,因为UDPClient需要将BoundPort与UDPServer的绑定端口相同。那是因为响应被发送到请求来自的同一端口。这导致了主要错误,这是用rsTrue属性解决的。
现在我想知道,系统是否有可能通过某些东西覆盖此设置,我不熟悉?因为到目前为止我已经测试了12台计算机,它工作正常(在一台我必须杀死Bonjour服务,因为它使用了我需要的确切端口,但除此之外......)
否则可能导致错误?
这些是在“连接”按钮上单击时调用的设置:
Server.Binding.IP:=Interface.Text;
Server.Binding.Port:=StrToInt(Port.Text);
Server.DefaultPort:=StrToInt(Port.Text);
Client.Host:= DeviceIP.Text;
Client.Port:= 10023;
Client.BoundIP:= Interface.Text;
Client.BoundPort:= StrToInt(Port.Text);
LocalServer.Binding.IP:= '127.0.0.5';
LocalServer.Binding.Port:= 10023;
LocalServer.DefaultPort:= 10023;
LocalClient.BoundIP:= '127.0.0.1';
LocalClient.BoundPort:= 10024;
LocalClient.Host:= '127.0.0.1';
LocalClient.Port:= 10023;
try Client.Active:=True; finally end;
try Server.Active:=True; finally end;
try LocalClient.Active:=True; finally end;
try LocalServer.Active:=True; finally end;
其中Port是用户输入端口的TEdit字段,DeviceIP是设备的IP,接口是他将使用的本地网络接口IP。
唯一不需要硬编码的硬编码是LocalClient.BoundPort:= 10024,它只是让GUI尽可能轻。但改变这一点也无济于事。
该应用程序是PC上的原始应用程序和网络上的设备之间的代理服务器。
10023必须按原样设置,因为设备只侦听该端口,而原始应用只发送到该端口!
任何帮助都将不胜感激。
答案 0 :(得分:1)
您无需在同一端口上使用单独的TIdUDPClient
和TIdUDPServer
。您可以单独使用TIdUDPServer
并让它处理发送和接收。无需单独使用单独的TIdUDPClient
。
此外,您没有正确使用Binding
属性。当您第一次读取服务器的Binding
属性时,将使用服务器的Bindings
集合中的设置绑定套接字。然后会忽略您对Binding.IP
和Binding.Port
的分配。您需要先配置服务器的Bindings
集合,然后仅使用服务器的Binding
属性进行发送(服务器将为您处理读数)。
试试这个:
Server.Active := False;
Server.Bindings.Clear;
Server.DefaultPort := StrToInt(Port.Text);
Server.Bindings.Add.IP := Interface.Text;
Server.Active := True;
...
Server.Binding.Send(DeviceIP.Text, 10023, data here);
回复将在服务器的OnUDPRead
事件中到达。
顺便说一句,既然您正在编写代理,请查看TIdMappedPortUDP
组件。