Delphi XE3-在任何情况下,重用套接字rsTrue都会被系统覆盖吗?
最近,我制作了一些非常小、非常轻的应用程序,它使用两个UDP客户端和两个UDP服务器组件。除了几个功能外,它基本上没有其他功能。 我被“无法绑定套接字。地址和端口已在使用”困扰了一段时间,但不知何故,通过更改端口,在重用套接字上使用rsTrue属性,解决了这个问题,但不知何故,一些用户在尝试从应用程序运行连接时仍然遇到了这个错误 服务器和客户端必须使用相同的端口和地址,因为UDPClient需要具有与UDPServer绑定端口相同的BoundPort。这是因为响应被发送到请求来自的同一端口。这是导致主要错误的原因,该错误已通过rsTrue属性解决 现在我想知道,有没有可能系统会以我不熟悉的方式覆盖这些设置?因为到目前为止,我已经测试了12台计算机,它工作得很好(在一台计算机上,我不得不终止Bonjour服务,因为它使用的正是我需要的端口,但除此之外……) 否则什么会导致错误 这些是在单击“连接”按钮时调用的设置:Delphi XE3-在任何情况下,重用套接字rsTrue都会被系统覆盖吗?,delphi,sockets,indy10,Delphi,Sockets,Indy10,最近,我制作了一些非常小、非常轻的应用程序,它使用两个UDP客户端和两个UDP服务器组件。除了几个功能外,它基本上没有其他功能。 我被“无法绑定套接字。地址和端口已在使用”困扰了一段时间,但不知何故,通过更改端口,在重用套接字上使用rsTrue属性,解决了这个问题,但不知何故,一些用户在尝试从应用程序运行连接时仍然遇到了这个错误 服务器和客户端必须使用相同的端口和地址,因为UDPClient需要具有与UDPServer绑定端口相同的BoundPort。这是因为响应被发送到请求来自的同一端口。这是
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,Interface是用户将使用的本地网络接口IP
唯一不需要硬编码的东西是LocalClient.BoundPort:=10024,这只是为了使GUI尽可能轻。但改变这一点也无济于事
该应用程序是PC上原始应用程序和网络设备之间的代理服务器
10023必须按原样设置,因为设备仅侦听该端口,而原始应用程序仅发送到该端口
非常感谢您的帮助。您不需要在同一端口上使用单独的
TIdUDPClient
和TIdUDPServer
。您可以单独使用TIdUDPServer
,让它处理发送和接收。根本不需要使用单独的TIdUDPClient
此外,您没有正确使用绑定
属性。首次读取服务器的绑定
属性时,将使用服务器的绑定
集合中的设置绑定套接字。然后将忽略对Binding.IP
和Binding.Port
的分配。您需要首先配置服务器的绑定
集合,然后仅将服务器的绑定
属性用于发送(服务器将为您处理读取)
试试这个:
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
组件。将查看此组件。我已经使用了OnUDPRead,但不知道我也可以用它来发送数据。非常感谢。另外,对于绑定,我尝试了bindings.add.IP和port,然后在启动时设置一些默认值,使用bindings[0].IP和port替换它们,然后使用bindings[0].IP和port替换它们,这两种方法都很好,只需进行一些处理……一旦绑定套接字,就无法替换IP/端口。您必须停用并重新激活服务器才能更改它们。但我在激活之前更改了它。。?它没有任何区别吗?没有,因为您使用了绑定
属性(单数)进行更改,并且访问绑定
会导致套接字与现有值绑定,然后才能进行更改。绑定后更改IP/端口不会将新值应用于绑定的套接字。您要进行的任何更改都必须改为对绑定
属性(复数)进行更改,然后通过(重新)激活
)进行应用。似乎已解决。如您所说,使用服务器发送数据。谢谢你的建议!