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

时间:2012-03-28 09:22:47

标签: c++ c sockets

我有一个用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。

你知道怎么解决吗?

3 个答案:

答案 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获取各种操作系统的接口,也可以将其专门绑定到请求的接口。