2011-08-03 32 views
2

我在寫一個(相當簡單:)的網絡應用程序,並使用localhost:27488127.0.0.1:27488)進行測試。
我正在使用System.Net.Sockets.TcpClient進行連接,這需要System.Net.IPAddress來指定主機...唯一的問題是,我無法弄清楚如何使用正確的IP地址初始化類。我翻閱了MSDN文檔,它說這個地址需要一個Byte(4)或一個Int64long)。
的萬阿英,蔣達清,當我初始化IPAddress這樣的:System.Net.IPAddress返回奇怪的地址

Dim ipAddr As New System.Net.IPAddress(127001) 

它返回的地址作爲25.240.1.0。從我從文檔中瞭解到,127001應該返回127.0.0.1 ...也許我錯過了那裏的東西? http://msdn.microsoft.com/en-us/library/13180abx.aspx

+2

使用你的假設,如果你本來想要的'12.70.0.1'的IP;這不會是'127001'嗎?看起來你確實錯過了文檔中的某些內容,例如「_例如,大端格式的值0x2414188f將是IP地址」143.24.20.36「._」部分。 – ckittel

+0

好點...我想我沒有得到:/ –

回答

4

簡短的回答:使用TcpClient.Connect(字符串,整數)代替;它接受IPv4/IPv6地址或主機名/別名,因此您不限於通過IP進行連接。例如:

Dim client As TcpClient 
client.Connect("localhost", 27488) 
client.Connect("127.0.0.1", 27488) 

但是25.240.1.0從哪裏來?嘗試以下方法:

  • 打開計算值,切換到程序員視圖,選擇減速
  • Type在127001,然後切換到十六進制
  • 寫出來的結果,在左邊墊加入零到4個字節/ 32位:0001F019
  • 獨立這個數字成各個字節:00 01 F0 19
  • 反向的字節順序:19 F0 01 00
  • 轉換每個字節回十進制:25 240 1 0
  • 用點:25.240.1.0

爲什麼扭轉字節?你的處理器架構是小端的;數字在內存中表示最低有效字節。 IPv4地址被標準化爲big-endian格式(最重要的字節在先;也被稱爲網絡命令)。構造函數IPAddress(Int64)正在反轉要從LE轉換爲BE的字節。

通過顛倒上述步驟,IPAddress(Int64)構造函數中環回的正確值將是&H0100007F(十六進制)或16777343(十進制)。

IPAddress(Byte[4])構造發生在網絡秩序的字節數組,所以這將是New Byte() { 127, 0, 0, 1 }

5

你誤會它是如何工作的。 IP地址由4個字節組成,表示爲127.0.0.1只是一個可讀的約定。在引擎蓋下,127.0.0.1表示爲((127 << 24) | (0 << 16) | (0 << 8) | 1)。 在你的情況,這將是更容易和更具有可讀性只使用.Parse(string)方法是這樣的:

IPAddress.Parse("127.0.0.1");

2

爲什麼不試試IPAddress.Parse方法?

你會做這樣的事情:

Dim ipAddr as IPAddress = IPAddress.Parse("127.0.0.1")