作为客户,我执行$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地址。 (请不要成为那些说“你为什么想知道”的人之一)
答案 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地址......