C++ 如何从struct sockaddr(不是路由器IP)获取Internet IP?
我有一个用C编码的服务器。在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 您知
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;
}