2017-10-18 134 views
-2

作为一个客户我做了一个socket(),它给了我一个号码我在sktnum存储。然后我用sktnum和远程地址做connect()。嘿presto,它成功了,我被告知内核已经选择了一个本地IP地址和端口号(以便服务器知道要发回的位置)。我可以调用什么函数(linux C/C++)来查找内核选择的端口和IP地址。 (请不要被那些谁的人说:“你为什么想知道?”之一)哪个函数告诉我内核绑定本地套接字的地址?

+0

https://stackoverflow.com/questions/30597111/get-local-port-used-通过插座 – melpomene

回答

2

我不知道我是否正确地理解你的问题。我的理解是通过以下方式:

计算机 “A” 使用socket()connect()建立一个TCP连接到计算机 “B”,这是使用socket()bind()listen()access()

的IP地址和计算机“B” TCP端口是众所周知的(当然 - 您连接到一定 TCP端口一定计算机上)。

但是,如何找到属于此连接的计算机“A”的IP地址和TCP端口?

在计算机“A”上这样做的功能是getsockname()

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

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

在调用connect()插座没有端口号和没有IP地址,但。因此在致电connect()之前致电getsockname()是没有意义的。

这样做的理由很简单:如果计算机具有多个网络卡不同的IP地址的计算机上的IP地址“A”侧不能之前,已知其中网络卡必须使用公知的。 (注意:localhost被看作是单独的 “网卡” 由OS IP地址127.0.0.1!)

编辑

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

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

从来没有在这种想法的改变:几乎所有的PC软件(包括操作系统),对于具有全球IP地址的计算机被写入。

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

由于这种“模拟”,计算机的行为可能与192.168.x.y完全相同,它是Internet中的全局IP地址。计算机甚至没有任何关于这不是全球IP地址的信息!

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

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

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

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

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

这就是为什么开发的IPv6的一个原因:随着IPv6任何计算机都可以有一次自己的IP地址......

+0

马丁 - 我不认为你是正确的。 getsockname()需要调用者提供套接字文件描述符(sockfd)。但我们不会知道当地的。我们知道我们使用socket()创建的一个,但是当我们将它与connect()一起使用时,它与REMOTE IP地址关联,而不是本地IP地址。 – Clive

+0

我想我可能已经制定了一个答案,但它仍然不足以满足我的要求。你可以使用gethostname()然后getaddrinfo()返回它的内容。但我认为你可能只会得到127.0.0.1或一个地址从192.168开始。这是网关(路由器)可能在DHCP操作中分配给你的。它不会为您提供您在互联网上分配的(临时)IP地址。 – Clive

+0

@Clive请参阅我的编辑:对不起,但我认为你想做的事是不可能的。 –

相关问题