Delphi XE3 - 在任何情况下,系统都会覆盖重用套接字rsTrue吗?

时间:2014-04-24 09:58:57

标签: delphi sockets indy10

最近我制作了一个非常小巧,非常轻便的应用程序,它使用两个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必须按原样设置,因为设备只侦听该端口,而原始应用只发送到该端口!

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

您无需在同一端口上使用单独的TIdUDPClientTIdUDPServer。您可以单独使用TIdUDPServer并让它处理发送和接收。无需单独使用单独的TIdUDPClient

此外,您没有正确使用Binding属性。当您第一次读取服务器的Binding属性时,将使用服务器的Bindings集合中的设置绑定套接字。然后会忽略您对Binding.IPBinding.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组件。