我有一个用C编码的服务器。在accept()
之后,我想从sockaddr获取IP地址。
但我得到的IP地址是我所在的VM:10.0.x.x,而不是互联网IP。 VM托管在具有真实IP的计算机上,这是我想要的。
端口转发已完成。 示例:我有2台运行相同VM的计算机,因此它们具有相同的VM本地IP(10.0.x.x)。第一个VM启动服务器,第二个VM使用telnet连接使用真实服务器的IP(147.x.x.x)。连接已正确建立,但我在sockaddr中获取的IP是VM。
你知道怎么解决吗?
答案 0 :(得分:3)
你需要一个"第三方"在外面,例如(web)服务器,它将返回/打印活动连接的远程IP。通过这种方式,您可以获得互联网IP"在本地NAT后面。
答案 1 :(得分:0)
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;
}
答案 2 :(得分:0)
也许我错了...但是你的VM似乎已经为自己建立了一个“内部”网络(因此10.0 .... IP)。根据我的经验,当VM配置为具有NAT类型的网络并且DHCP VM服务正在运行时,会发生这种情况。尝试使用Bridged。这可能会为您提供多个网络接口,因此您必须具体告诉服务器它应该绑定/监听哪个接口。有一些代码可以在http://pici-nms.cvs.sourceforge.net/viewvc/pici-nms/common/NetworkInterface.cpp?view=markup获取各种操作系统的接口,也可以将其专门绑定到请求的接口。