在TCP连接中使用Bind方法的最佳方法是什么?

问题描述 投票:2回答:1

我有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方法的描述,但根本没有帮助你能给出一些方向吗?

事先提前

delphi tcp
1个回答
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()'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');

根据documentation

如果端口值为“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()将根据需要简单地隐式绑定到适当的本地接口。

© www.soinside.com 2019 - 2024. All rights reserved.