Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi XE3-在任何情况下,重用套接字rsTrue都会被系统覆盖吗?_Delphi_Sockets_Indy10 - Fatal编程技术网

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

Delphi XE3-在任何情况下,重用套接字rsTrue都会被系统覆盖吗?,delphi,sockets,indy10,Delphi,Sockets,Indy10,最近,我制作了一些非常小、非常轻的应用程序,它使用两个UDP客户端和两个UDP服务器组件。除了几个功能外,它基本上没有其他功能。 我被“无法绑定套接字。地址和端口已在使用”困扰了一段时间,但不知何故,通过更改端口,在重用套接字上使用rsTrue属性,解决了这个问题,但不知何故,一些用户在尝试从应用程序运行连接时仍然遇到了这个错误 服务器和客户端必须使用相同的端口和地址,因为UDPClient需要具有与UDPServer绑定端口相同的BoundPort。这是因为响应被发送到请求来自的同一端口。这是

最近,我制作了一些非常小、非常轻的应用程序,它使用两个UDP客户端和两个UDP服务器组件。除了几个功能外,它基本上没有其他功能。 我被“无法绑定套接字。地址和端口已在使用”困扰了一段时间,但不知何故,通过更改端口,在重用套接字上使用rsTrue属性,解决了这个问题,但不知何故,一些用户在尝试从应用程序运行连接时仍然遇到了这个错误

服务器和客户端必须使用相同的端口和地址,因为UDPClient需要具有与UDPServer绑定端口相同的BoundPort。这是因为响应被发送到请求来自的同一端口。这是导致主要错误的原因,该错误已通过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,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/端口不会将新值应用于绑定的套接字。您要进行的任何更改都必须改为对
绑定
属性(复数)进行更改,然后通过
(重新)激活
)进行应用。似乎已解决。如您所说,使用服务器发送数据。谢谢你的建议!