2013-05-06 54 views
1

在具有多個IPv4地址的環境中,如何選擇要監聽的地點?我已經有好有壞運氣用下面的代碼:如何決定使用哪個IPv4地址?

foreach(IPAddress addr in Dns.GetHostAddresses(Dns.GetHostName())) 
    if (addr.AddressFamily == AddressFamily.InterNetwork) 
     if (!IPAddress.IsLoopback(addr)) 
      return addr.ToString(); 

因爲它不考慮下面的接口適配器是一個迴環地址:

Ethernet adapter loopback: 
Connection-specific DNS Suffix . : 
Description . . . . . . . . . . . : Microsoft Loopback Adapter 
Physical Address. . . . . . . . . : XX.XX.XX.XX.XX.XX 
DHCP Enabled. . . . . . . . . . . : Yes 
Autoconfiguration Enabled . . . . : Yes 
Autoconfiguration IPv4 Address. . : 169.254.XXX.XXX(Preferred) 
Subnet Mask . . . . . . . . . . . : 255.255.0.0 
Default Gateway . . . . . . . . . : 
DNS Servers . . . . . . . . . . . : XXX: XXX: XXX:XXXX::XXX 
            XXX: XXX: XXX:XXXX::XXX 
            XXX: XXX: XXX:XXXX::XXX 
NetBIOS over Tcpip. . . . . . . . : Enabled 

我見過一些程序員假設一個名爲NetworkInterface 「本地連接」存在並始終是正確的界面,但我認爲這不是正確的方法。

+5

你爲什麼不聽所有*接口?這是大多數服務器應用程序所做的,除非它們被配置爲另外做。 – Heinzi 2013-05-06 14:52:57

+3

Heinzi ++ :)在這種情況下,使用'IPAddress.Any'作爲IP地址。 – 2013-05-06 14:53:20

+0

如果有疑問,請在所有界面上進行收聽。如果你只想要一個特定的IP地址,用戶應該選擇它(就像在Wireshark中完成的那樣)。否則,軟件無法知道目標是什麼。 – JeffRSon 2013-05-06 14:55:13

回答

1

我認爲沒有意義過濾接口,因爲您可能在設備上有多個卡(例如以太網& wifi)。如果你正在開發一個服務器組件,你肯定會想要獲得所有的請求,無論他們使用什麼接口。