2012-03-28 102 views
0

我有一个编码为C的服务器。在accept()之后,我想从sockaddr获取IP地址。 但我得到的IP地址是来自我所在的VM的:10.0.x.x,而不是互联网IP。虚拟机托管在具有真实IP的计算机上,这是我想得到的。如何从struct sockaddr(不是路由器IP)获得Internet IP?

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

你知道如何解决它吗?

+0

您是否试过从远程网络上的机器连接? – 2012-03-28 09:26:42

回答

3

您需要外面的“第三方”,例如一个只会返回/打印活动连接的远程IP的(网络)服务器。这样你就可以在本地NAT后面获得你的“互联网IP”。

+0

谢谢,我认为这是我找到工作的唯一途径。 – Olivier 2012-03-29 12:25:12

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; 
} 
+0

我已经做到了这一点,我仍然得到VM IP。 – Olivier 2012-03-29 12:19:54

0

也许我错了,这... ...但是似乎你的虚拟机已经建立了自己的“内部”网络(因此10.0 .... IPS)。根据我的经验,当VM配置为具有NAT类型的网络并且DHCP VM服务正在运行时发生这种情况。尝试使用Bridged。这可能会给你多个网络接口,所以你必须特别告诉服务器它应该绑定/监听哪个接口。在http://pici-nms.cvs.sourceforge.net/viewvc/pici-nms/common/NetworkInterface.cpp?view=markup有一些代码用于获取各种操作系统的接口,并且还可以将它们专门绑定到请求的接口。

+0

不幸的是,我不能改变这些设置,因为它是一个学校网络。 – Olivier 2012-03-29 12:21:19