gpt4 book ai didi

c - 哪个函数告诉我内核将本地套接字绑定(bind)到哪个地址?

转载 作者:行者123 更新时间:2023-11-30 20:10:16 25 4
gpt4 key购买 nike

作为客户端,我执行了 socket(),它给了我一个存储在 sktnum 中的数字。然后,我使用 sktnum 和远程地址执行 connect() 。嘿,很快,它成功了,我被告知内核已经选择了本地 IP 地址和端口号(这样服务器就知道要发送回哪里)。我调用什么函数(linux C/C++)来找出内核选择的端口和IP地址。 (请不要成为那些说“你为什么想知道”的人之一)

最佳答案

我不确定我是否正确理解你的问题。我是这样理解的:

Computer "A" uses socket() and connect() to establish a TCP connection to computer "B" which is using socket(), bind(), listen() and access().

The IP address and the TCP port on computer "B" is well known (of course - you connect to a certain TCP port on a certain computer).

But how is it possible to find out the IP address and the TCP port on computer "A" belonging to this connection?

在计算机“A”上执行此操作的函数是 getsockname()

在计算机“B”上 getpeername() 将返回该信息。

如果计算机“B”有多个 IP 地址(例如多个网卡),计算机“B”也可以使用 getsockname() 来获取自己的 IP 地址。

在调用 connect() 之前,套接字还没有端口号和 IP 地址。因此,在调用 connect() 之前调用 getsockname() 是没有意义的。

原因很简单:如果一台计算机有多个具有不同 IP 地址的网卡,则在知道必须使用哪一个网卡之前,无法知道计算机“A”侧的 IP 地址。 (请注意,localhost 被操作系统视为单独的“网卡”,IP 地址为 127.0.0.1!)

编辑

But I think you might only get ... 192.168. ... It doesn't give you the ... IP address you are alloted on the internet.Your problem can be explained the following way:

互联网的最初想法是每台计算机都有自己的全局 IP 地址(这就是您所说的:“您在互联网上分配的地址”)。

这个想法从未改变:几乎所有 PC 软件(包括操作系统)都是为具有全局 IP 地址的计算机编写的。

由于您的提供商只能为您提供一个 IP 地址,因此您的路由器通过“模拟”本地计算机具有全局地址(例如在 192.168 范围内)的互联网来“欺骗”您的计算机。

由于这种“模拟”,计算机的行为就像 192.168.x.y 是其在互联网中的全局 IP 地址一样。计算机甚至没有任何关于这不是全局 IP 地址这一事实的信息!

很明显,这些函数返回 192.168.x.y,因为操作系统“认为”这是互联网上的全局地址!

唯一拥有有关真实全局地址(以及真实 TCP 端口!!!)信息的设备是路由器!

许多提供商使用 CGNAT,这意味着即使多个互联网连接也共享一个 IP 地址。在这种情况下,唯一拥有该信息的设备是提供商的路由器。

如果您需要真实的 IP 地址和真实的 TCP 端口(如从互联网上看到的),您将从路由器获取该信息。根据路由器型号,将无法获取有关真实地址的信息。

我怀疑市面上有没有路由器可以让你读出真实的TCP端口。

这是开发 IPv6 的原因之一:通过 IPv6,任何计算机都可以再次拥有自己的 IP 地址...

关于c - 哪个函数告诉我内核将本地套接字绑定(bind)到哪个地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46803345/

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