哪个函数告诉我内核绑定本地套接字的地址是什么?

时间:2017-10-18 05:26:59

标签: c linux function sockets ip-address

作为客户,我执行$sql = array(); foreach( $insertArray as $row ) { $sql[] = '("'.mysql_real_escape_string($row['custmr_id']).'", '.$row['name'].', '.$row['credit'].', '.$row['debit'].', '.$row['balance'].')'; } mysql_query('INSERT INTO single (`custmr_id`, `name`, `credit`, `debit`, `balance`) VALUES '.implode(',', $sql)); ,它会在socket()中为我提供一个号码。然后,我使用sktnum和远程地址进行connect()。嘿presto,它成功了,我被告知内核已经选择了一个本地IP地址和端口号(因此服务器将知道在哪里发回)。我调用什么函数(linux C / C ++)来找出内核选择的端口和IP地址。 (请不要成为那些说“你为什么想知道”的人之一)

1 个答案:

答案 0 :(得分:2)

我不确定我是否理解你的问题。我理解它的方式如下:

  

计算机" A"使用socket()connect()建立与计算机的连接" B"正在使用socket()bind()listen()access()

     

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

     

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

将在计算机上执行此操作的功能" A"是getsockname()

在电脑" B" getpeername()将返回该信息。

如果是电脑" B"具有多个IP地址(例如多个网卡)计算机" B"也可以使用getsockname()来获取自己的IP地址。

在调用connect()之前,套接字没有端口号,也没有IP地址。因此,在致电getsockname()之前致电connect()毫无意义。

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

修改

  

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

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

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

因为您的提供商只能为您提供一个IP地址,您的路由器就是“愚弄”#34;您的计算机通过"模拟"互联网,其中本地计算机具有全局地址(例如,在192.168范围内。)。

由于这个"模拟"计算机的行为与192.168.x完全相同。它是互联网上的全球IP地址。计算机甚至没有任何关于这不是全球IP地址的信息!

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

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

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

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

我怀疑市场上是否有任何路由器允许您读出真正的TCP端口。

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