2011-05-19 34 views
1

我正在C++上實現UpNP,我需要獲取由路由器分配的本地內部IP地址以使套接字工作。我需要的地址是出現在路由器上的地址,它顯示連接到路由器的計算機和分配給每臺計算機的本地IP。我用這:是 - > h_addr_list [0]我需要的地址?

PHOSTENT  Addr = NULL; 
char   Host[MAX_PATH]; 

if(gethostname(Host, sizeof(Host)) == 0) 
{ 
    Address = gethostbyname(Host); 
    if(Address != NULL) 
    { 
     //*(struct in_addr *)Address->h_addr_list[0]) <- this is my address 
    } 
} 

這工作得很好,我測試的計算機上,但計算機只有一個網卡,所以我在想,如果可能,當一臺計算機有多個網卡或網絡設備,地址 - > h_addr_list [0]可能不是我需要的那個,它可能在該數組的另一個索引中。

[0]總是檢索由路由器分配的IP?

+0

不可以。你不能從計算機上知道哪些IP來自哪裏;如果電腦同時擁有有線和無線適配器會怎麼樣?在這種情況下,IP可能來自路由器。 – Joe 2011-05-19 00:37:49

回答

0

(這裏假設Winsock的,按照前文的問題)

你不應該假設第一個地址是正確的(因爲可能有多個接口,和一個以上的可同時工作)

我建議使用getaddrinfo和空pNodeName參數或GetAdaptersAddresses來枚舉地址。

這兩個回用系統的註冊地址

0

一個鏈表...獲取路由器分配本地內部IP地址...

注意,在某些情況下,機器的IP地址將被手動分配,但用戶仍然希望使用UPnP。

在Linux上,建議使用getaddrinfo(3)而不是gethostbyname(3),也許Winsocks做出了類似的轉換?

在Linux上,/etc/hosts環路條目通常也可以通過主機名訪問; /etc/gai.conf可用於配置返回地址的排序順序,並可能會返回一個環回地址。 Winsock是否使系統管理員可以輕鬆更改返回地址的順序?

不要忘記的是,系統可以合法具有多個上游路由器:與EV-DO或EDGE或類似蜂窩數據連接無線或有線以太網將具有多個IP地址,多個上游路由器膝上型計算機,和將查詢路由表以找出應該使用哪一個來發送每個分組。

您可以使用(a)客戶用來與您聯繫的地址嗎? (getsockname(2)將返回在特定套接字上使用的本地地址。)(b)要求用戶在IP地址列表中進行選擇,如果有多個?綁定N個M接口會很好,所以用戶可以選擇哪個網絡獲得服務,哪些網絡是獨立的。