我在同一台计算机上运行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');
下面的这段代码有效
tmpTcp := TTCPBlockSocket.Create;
tmpTcp.Bind('192.168.1.1', '50000');
tmpTcp.Connect('192.168.1.195', '50000');
我看到了Bind方法的描述,但根本没有帮助 您可以为此提供一些指导吗?
先付钱
答案 0 :(得分:4)
我在同一台计算机上运行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()
使用相同的IP /端口。不要那样。
除非协议/网络限制(在您的情况下均不适用)要求,否则TCP客户端不应绑定到特定端口,即使它绑定到特定接口也是如此。让客户端使用操作系统分配的临时端口,例如:
Connect()
如果端口值为'0',则系统自行选择并连接未使用的端口,范围为1024到4096(这取决于操作系统!)。
或者更好的是,根本不tmpTcp := TTCPBlockSocket.Create;
tmpTcp.Bind('192.168.1.195', '0'); // <-- note the '0'!
tmpTcp.Connect('192.168.1.195', '50000');
客户端,让操作系统在Bind()
期间为您解决该问题:
Connect()
操作系统会将客户端隐式绑定到可以访问tmpTcp := TTCPBlockSocket.Create;
tmpTcp.Connect('192.168.1.195', '50000');
的适当接口。
下面的这段代码有效
192.168.1.195
仅因为tmpTcp := TTCPBlockSocket.Create;
tmpTcp.Bind('192.168.1.1', '50000');
tmpTcp.Connect('192.168.1.195', '50000');
实际上会失败,因为IP对本地计算机无效,然后Bind()
会根据需要简单地隐式绑定到适当的本地接口。