【问题标题】:System.Net.IPAddress returning weird addressesSystem.Net.IPAddress 返回奇怪的地址
【发布时间】:2011-08-03 16:00:39
【问题描述】:

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

【问题讨论】:

  • 使用您的假设,如果您想要12.70.0.1 的 IP 怎么办;那不是127001吗?似乎您确实错过了文档中的某些内容,例如“例如,大端格式的值 0x2414188f 将是 IP 地址“143.24.20.36”。”部分。
  • 好点...我想我没明白:/

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


【解决方案1】:

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

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 地址被标准化为大端格式(最高有效字节在前;又名网络顺序)。 IPAddress( Int64 ) 构造函数正在反转字节以从 LE 转换为 BE。

颠倒上述步骤,IPAddress( Int64 ) 构造函数中环回的正确值将是&H0100007F(十六进制)或16777343(十进制)。

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

【讨论】:

    【解决方案2】:

    您误解了它的工作原理。 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");

    【讨论】:

      【解决方案3】:

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

      你会做这样的事情:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        相关资源
        最近更新 更多