我有2个应用程序在同一台机器上运行,一个充当TCP服务器,另一个充当TCP客户端。在那台机器上,我有2个网络接口,因此必须告诉TCP连接应该使用哪一个。为此,我一直在使用Bind方法,因为我知道一个是192.168.1.x而另一个是10.1.135.x,但我的疑问是:当我把机器IP本身,例如,192.168.1.195这不起作用,但如果我把网关IP 192.168.1.1它工作。不起作用的代码是
tmpTcp := TTCPBlockSocket.Create;
tmpTcp.Bind('192.168.1.195', '50000');
tmpTcp.Connect('192.168.1.195', '50000');
这段代码,下面是Works
tmpTcp := TTCPBlockSocket.Create;
tmpTcp.Bind('192.168.1.1', '50000');
tmpTcp.Connect('192.168.1.195', '50000');
我看到了Bind方法的描述,但根本没有帮助你能给出一些方向吗?
事先提前
我有2个应用程序在同一台机器上运行,一个充当TCP服务器,另一个充当TCP客户端。在那台机器上,我有2个网络接口,因此必须告诉TCP连接应该使用哪一个。
不,绑定到一个接口与另一个接口不是必须的。例如,您可以通过将服务器绑定到通配符0.0.0.0
将服务器绑定到两个接口,然后客户端可以使用它想要到达服务器的任一接口。或者,由于客户端与服务器位于同一台计算机上,因此您可以将服务器绑定到127.0.0.1
,这样只允许来自本地计算机而不是网络的连接。
我的疑问是:当我把机器IP本身,例如,192.168.1.195,这不起作用
是的,它确实有效,并且它是将套接字绑定到Windows上的特定接口的唯一方法(还有其他方法可以绑定到* Nix平台上的接口)。您必须Bind()
到分配给接口的实际IP。您无法绑定到外部IP,例如路由器/网关IP。
但如果我把网关IP 192.168.1.1它工作。
不,它不起作用。您不能将Bind()
发送到不属于本地计算机的IP。
不起作用的代码是
tmpTcp := TTCPBlockSocket.Create; tmpTcp.Bind('192.168.1.195', '50000'); tmpTcp.Connect('192.168.1.195', '50000');
这失败是因为你是Bind()
'ing到相同的IP /端口,然后你Connect()
'ing到。不要那样做。
除非协议/网络限制要求(在您的情况下都不适用),TCP客户端不应绑定到特定端口,即使它绑定到特定接口。让客户端使用操作系统分配的短暂端口,例如:
tmpTcp := TTCPBlockSocket.Create;
tmpTcp.Bind('192.168.1.195', '0'); // <-- note the '0'!
tmpTcp.Connect('192.168.1.195', '50000');
如果端口值为“0”,系统会自行选择并在1024到4096范围内连接未使用的端口(这取决于操作系统!)。
或者更好,根本就不要Bind()
客户端,让操作系统在Connect()
期间为你找出它:
tmpTcp := TTCPBlockSocket.Create;
tmpTcp.Connect('192.168.1.195', '50000');
操作系统将隐式地将客户端绑定到可以到达192.168.1.195
的适当接口。
这段代码,下面是Works
tmpTcp := TTCPBlockSocket.Create; tmpTcp.Bind('192.168.1.1', '50000'); tmpTcp.Connect('192.168.1.195', '50000');
只是因为Bind()
实际上会失败,因为IP对于本地机器是无效的,然后Connect()
将根据需要简单地隐式绑定到适当的本地接口。