簡體   English   中英

如何從struct sockaddr(不是路由器IP)獲取Internet IP?

[英]How to get Internet IP from struct sockaddr (not router IP)?

我有一個用C編碼的服務器。accept accept() ,我想從sockaddr獲取IP地址。 但是我獲得的IP地址是我所在的VM上的IP地址:10.0.xx,而不是Internet IP。 VM托管在具有真實IP的計算機上,這是我想獲得的IP。

端口轉發已完成。 示例:我有2台計算機運行相同的VM,因此它們具有相同的VM本地IP(10.0.xx)。 第一個VM啟動服務器,第二個VM使用telnet使用真實服務器的IP(147.xxx)進行連接。 連接已正確建立,但我在sockaddr中獲得的IP是VM。

你知道如何解決嗎?

您將需要外部的“第三方”,例如(Web)服務器,它將僅返回/打印活動連接的遠程IP。 這樣,當您在本地NAT后面時,便可以獲取“ Internet ip”。

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

也許我錯了...但是,看來您的VM為其本身建立了一個“內部”網絡(因此為10.0 .... IP)。 以我的經驗,當VM被配置為具有NAT類型的網絡並且正在運行DHCP VM服務時,就會發生這種情況。 嘗試橋接。 這可能會為您提供多個網絡接口,因此您必須專門告訴服務器應將其綁定/偵聽到哪個接口。 http://pici-nms.cvs.sourceforge.net/viewvc/pici-nms/common/NetworkInterface.cpp?view=markup中有一些代碼可以獲取各種操作系統的接口,還可以將其專門綁定到請求的接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM