2012-03-28 100 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