作为一个客户我做了一个socket()
,它给了我一个号码我在sktnum
存储。然后我用sktnum
和远程地址做connect()
。嘿presto,它成功了,我被告知内核已经选择了一个本地IP地址和端口号(以便服务器知道要发回的位置)。我可以调用什么函数(linux C/C++)来查找内核选择的端口和IP地址。 (请不要被那些谁的人说:“你为什么想知道?”之一)哪个函数告诉我内核绑定本地套接字的地址?
回答
我不知道我是否正确地理解你的问题。我的理解是通过以下方式:
计算机 “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地址......
马丁 - 我不认为你是正确的。 getsockname()需要调用者提供套接字文件描述符(sockfd)。但我们不会知道当地的。我们知道我们使用socket()创建的一个,但是当我们将它与connect()一起使用时,它与REMOTE IP地址关联,而不是本地IP地址。 – Clive
我想我可能已经制定了一个答案,但它仍然不足以满足我的要求。你可以使用gethostname()然后getaddrinfo()返回它的内容。但我认为你可能只会得到127.0.0.1或一个地址从192.168开始。这是网关(路由器)可能在DHCP操作中分配给你的。它不会为您提供您在互联网上分配的(临时)IP地址。 – Clive
@Clive请参阅我的编辑:对不起,但我认为你想做的事是不可能的。 –
- 1. PHP:TCP套接字,'无法绑定地址'
- 2. 如何将一个链接本地地址绑定到一个ipv6套接字
- 3. 什么是套接字绑定以及如何绑定地址?
- 4. 如何将套接字绑定到Android上的本地wifi网络地址?
- 5. 我该如何让gdb告诉我一个给定地址的内存特征
- 6. 了解在udp套接字上分配内核地址的内核
- 7. 套接字只接受特定地址?
- 8. 如何告诉地址簿选择器填写哪些字段?
- 9. 绑定CosmosDB本地函数
- 10. 将套接字连接到设备上的本地地址
- 11. 为什么我不能IPv6套接字绑定到一个LINKLOCAL地址
- 12. 我将如何覆盖内核函数的返回地址?
- 13. C++绑定UDP套接字地址系列不支持
- 14. 为什么要将套接字绑定到地址?
- 15. Python:绑定套接字:“地址已在使用”
- 16. 将IPv4和IPv6源地址绑定到python套接字
- 17. 如何告诉我的.NET应用程序从哪个IP地址请求?
- 18. Mysql:使用每个套接字地址
- 19. 警告:函数返回局部变量的地址[-Wreturn-本地地址]
- 20. MySQL接受本地,本地网络和外部连接与绑定地址?
- 21. 获取套接字的本地IP地址
- 22. 如何让GDB告诉我哪个地址导致了段错误?
- 23. Python套接字 - 我将它绑定到IP后如何获取套接字的IP地址
- 24. 是否可以将套接字绑定到c中的2个地址?
- 25. IN6ADDR_ANY_INIT可以自动绑定到链接本地地址吗?
- 26. 连接与id地址ip - 套接字
- 27. 如何使用TCPv6将套接字绑定到本地用户
- 28. UDP本地套接字reliabiltiy
- 29. AIR本地套接字连接 - 错误#2031:套接字错误。网址:本地主机
https://stackoverflow.com/questions/30597111/get-local-port-used-通过插座 – melpomene