System.Net.IPAddress返回奇怪的地址

时间:2011-08-03 16:00:40

标签: vb.net networking ip-address system.net

我正在编写一个(相当简单的)网络应用程序,并使用localhost:27488127.0.0.1:27488)进行测试。
我使用System.Net.Sockets.TcpClient进行连接,需要System.Net.IPAddress来指定主机...唯一的问题是,我无法弄清楚如何使用正确的IP地址初始化类。我查看了MSDN文档,并说它需要Byte(4)Int64long)作为地址。
问题是,当我像这样初始化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

3 个答案:

答案 0 :(得分: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");

答案 1 :(得分:4)

简答:使用TcpClient.Connect(String,Int)代替;它接受IPv4 / IPv6地址或主机名/别名,因此您不限于通过IP连接。 e.g:

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

但是25.240.1.0来自哪里?请尝试以下方法:

  • 打开Calc,切换到Programmer视图,选择Dec
  • 键入127001,然后切换为十六进制
  • 写出结果,在左边添加零以填充到4个字节/ 32位:0001F019
  • 将该数字分成单个字节:00 01 F0 19
  • 反转字节顺序:19 F0 01 00
  • 将每个字节转换回十进制:25 240 1 0
  • 带点:25.240.1.0

为什么要反转字节?您的处理器架构是小端的;数字在内存中以最低有效字节表示。 IPv4地址标准化为big-endian格式(最重要的字节优先; a.k.a.网络顺序)。 IPAddress( Int64 )构造函数正在反转从LE转换为BE的字节。

反转上述步骤,IPAddress( Int64 )构造函数中回送的正确值为&H0100007F(十六进制)或16777343(十进制)。

IPAddress( Byte[4] )构造函数按网络顺序获取字节数组,因此New Byte() { 127, 0, 0, 1 }

答案 2 :(得分:2)

为什么不尝试IPAddress.Parse方法?

你会做类似的事情:

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