Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从struct sockaddr(不是路由器IP)获取Internet IP?_C++_C_Sockets - Fatal编程技术网

C++ 如何从struct sockaddr(不是路由器IP)获取Internet IP?

C++ 如何从struct sockaddr(不是路由器IP)获取Internet IP?,c++,c,sockets,C++,C,Sockets,我有一个用C编码的服务器。在accept()之后,我想从sockaddr获取IP地址。 但是我得到的IP地址是我所在虚拟机上的IP地址:10.0.x.x,而不是internet IP。虚拟机托管在一台具有真实IP的计算机上,这正是我想要的 端口转发已完成。 示例:我有两台计算机运行相同的VM,因此它们具有相同的VM本地IP(10.0.x.x)。第一个VM启动服务器,第二个VM使用telnet连接实际服务器的IP(147.x.x.x)。连接已正确建立,但我在sockaddr中获得的IP是VM 您知

我有一个用C编码的服务器。在
accept()
之后,我想从sockaddr获取IP地址。 但是我得到的IP地址是我所在虚拟机上的IP地址:10.0.x.x,而不是internet IP。虚拟机托管在一台具有真实IP的计算机上,这正是我想要的

端口转发已完成。 示例:我有两台计算机运行相同的VM,因此它们具有相同的VM本地IP(10.0.x.x)。第一个VM启动服务器,第二个VM使用telnet连接实际服务器的IP(147.x.x.x)。连接已正确建立,但我在sockaddr中获得的IP是VM


您知道如何解决吗?

您需要一个外部的“第三方”,例如一个(web)服务器,它只返回/打印活动连接的远程IP。这样,您就可以在本地NAT之后获得“internet ip”。

您需要一个外部的“第三方”,例如,一个(web)服务器,它只返回/打印活动连接的远程ip。这样你就可以在本地NAT后获得“internet ip”。

也许我错了。。。然而,您的虚拟机似乎已经为自己建立了一个“内部”网络(因此是10.0…IP)。根据我的经验,当虚拟机被配置为具有NAT类型的网络并且DHCP虚拟机服务正在运行时,就会发生这种情况。试试布里奇德。这可能会为您提供多个网络接口,因此您必须明确告知服务器应该绑定/侦听哪个接口。有一些代码用于在上获取各种操作系统的接口,以及将其专门绑定到请求的接口

也许我错了。。。然而,您的虚拟机似乎已经为自己建立了一个“内部”网络(因此是10.0…IP)。根据我的经验,当虚拟机被配置为具有NAT类型的网络并且DHCP虚拟机服务正在运行时,就会发生这种情况。试试布里奇德。这可能会为您提供多个网络接口,因此您必须明确告知服务器应该绑定/侦听哪个接口。有一些代码用于在上获取各种操作系统的接口,以及将其专门绑定到请求的接口

你试过从远程网络上的机器连接吗?你试过从远程网络上的机器连接吗?不幸的是,我无法更改这些设置,因为它是学校网络。不幸的是,我无法更改这些设置,因为它是学校网络。
uint32_t getip(int clientSock)
{
    socklen_t len;
    struct sockaddr_storage addr;
    struct sockaddr_in *s;

    len = sizeof addr;
    int res = getpeername(clientSock, (struct sockaddr*)&addr, &len);
    if ( 0 != res ) {
            return 0;
    }

    if (addr.ss_family == AF_INET)
            s = (struct sockaddr_in *)&addr;
    else // apparently AF_INET6
        return 0;

    return s->sin_addr.s_addr;
}