gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:36:51 26 4
gpt4 key购买 nike

我有两个应用程序在同一台机器上运行,一个充当 TCP 服务器,另一个充当 TCP 客户端。在那台机器上,我有 2 个网络接口(interface),所以必须告诉应该使用哪个 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 方法的描述,但没有任何帮助你能就此给出一些指导吗?

提前致谢

最佳答案

I have 2 applications running on the same machine, one acting as a TCP server and other as a TCP client. In that machine, I have 2 network interface, so it's mandatory to tell which one, the TCP connection should use.

不,绑定(bind)到一个接口(interface)与另一个接口(interface)不是强制。例如,您可以通过将服务器绑定(bind)到通配符 0.0.0.0 来将服务器绑定(bind)到两个 接口(interface),然后客户端可以使用它想要访问服务器的任一接口(interface)。或者,由于客户端与服务器位于同一台机器上,您可以将服务器绑定(bind)到 127.0.0.1,这将只允许来自本地机器的连接,而根本不允许来自网络的连接。

my doubt is: When I put the machine IP itself, for instance, 192.168.1.195 this doesn't work

是的,它确实有效,而且它是将套接字绑定(bind)到 Windows 上特定接口(interface)的唯一方法(在 *Nix 平台上还有其他方法可以绑定(bind)到接口(interface))。您必须 Bind() 到分配给接口(interface)的实际 IP。您不能绑定(bind)到外部 IP,例如路由器/网关 IP。

but if I put the gateway IP 192.168.1.1 it Works.

不,它不起作用。您不能 Bind() 到不属于本地计算机的 IP。

The code that doesn't work is

tmpTcp := TTCPBlockSocket.Create;
tmpTcp.Bind('192.168.1.195', '50000');
tmpTcp.Connect('192.168.1.195', '50000');

那会失败,因为您正在 Bind() 连接到您随后 Connect() 连接到的同一 IP/端口。不要那样做。

除非协议(protocol)/网络限制要求(您的情况均不适用),否则 TCP 客户端不应绑定(bind)到特定端口,即使它绑定(bind)到特定接口(interface)也是如此。让客户端改用操作系统分配的临时端口,例如:

tmpTcp := TTCPBlockSocket.Create;
tmpTcp.Bind('192.168.1.195', '0'); // <-- note the '0'!
tmpTcp.Connect('192.168.1.195', '50000');

根据 documentation :

If port value is '0', system chooses itself and conects unused port in the range 1024 to 4096 (this depending by operating system!).

或者更好的是,根本不要 Bind() 客户端,让操作系统在 Connect() 期间为您解决:

tmpTcp := TTCPBlockSocket.Create;
tmpTcp.Connect('192.168.1.195', '50000');

操作系统会将客户端隐式绑定(bind)到可以到达 192.168.1.195 的适当接口(interface)。

This piece of code, below, Works

tmpTcp := TTCPBlockSocket.Create;
tmpTcp.Bind('192.168.1.1', '50000');
tmpTcp.Connect('192.168.1.195', '50000');

只是因为 Bind() 实际上会失败,因为 IP 对本地机器无效,然后 Connect() 将简单地隐式绑定(bind)到适当的本地根据需要进行接口(interface)。

关于delphi - 在 TCP 连接中使用 Bind 方法的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55384177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com