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



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

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

计算机"A";使用CCD_ 5和CCD_;B";其使用socket()bind()listen()access()

计算机上的IP地址和TCP端口";B";是众所周知的(当然-您连接到特定计算机上的某个TCP端口)。

但是如何可能找出计算机上的IP地址和TCP端口;A";属于这种联系?

将在计算机上执行此操作的函数";A";是CCD_ 11。

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

如果计算机";B";具有多个IP地址(例如多个网卡)的计算机";B";13也可以使用CCD_ 13来获得其自己的IP地址。

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

原因很简单:如果一台计算机有多个具有不同IP地址的网卡;A";在知道必须使用哪一个网卡之前,不能知道哪一方。(注意,操作系统将localhost视为独立的"网卡",IP地址为127.0.0.1!)

编辑

但我认为你可能只会。。。192.168…它不会给你。。。您在互联网上分配的IP地址。您的问题可以通过以下方式解释:

互联网的最初想法是每台计算机都有自己的全局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地址。。。

最新更新