问题
I am writing a (rather simple :) networking application, and am testing it using localhost:27488
(127.0.0.1:27488
).
I am using a System.Net.Sockets.TcpClient
for the connection, which takes a System.Net.IPAddress
to specify the host... the only thing is, I can't figure out how to initialize the class with the right IP address. I went over the MSDN docs and it says it takes either a Byte(4)
or an Int64
(long
) for the address.
The probelm is, when I initialize the IPAddress
like this:
Dim ipAddr As New System.Net.IPAddress(127001)
it returns the address as 25.240.1.0
. From what I understand from the docs, 127001
should return 127.0.0.1
... Maybe I missed something there? http://msdn.microsoft.com/en-us/library/13180abx.aspx
回答1:
Short answer: use TcpClient.Connect( String, Int ) instead; it accepts an IPv4/IPv6 address or hostname/alias, so you are not limited to connecting by IP. e.g.:
Dim client As TcpClient
client.Connect( "localhost", 27488 )
client.Connect( "127.0.0.1", 27488 )
But where did 25.240.1.0 come from? Try the following:
- Open Calc, switch to Programmer view, select Dec
- Type in
127001
, then switch to Hex - Write out the result, adding zeroes on the left to pad to 4 bytes/32 bits:
0001F019
- Separate that number into individual bytes:
00 01 F0 19
- Reverse the byte order:
19 F0 01 00
- Convert each byte back to decimal:
25 240 1 0
- With dots:
25.240.1.0
Why reverse the bytes? Your processor architecture is little-endian; numbers are represented in memory with the least significant byte first. IPv4 addresses are standardized to big-endian format (most significant byte first; a.k.a. network order). The IPAddress( Int64 )
constructor is reversing the bytes to convert from LE to BE.
Reversing the steps above, the correct value for loopback in the IPAddress( Int64 )
constructor would be &H0100007F
(hex) or 16777343
(decimal).
The IPAddress( Byte[4] )
constructor takes the byte array in network order, so that would be New Byte() { 127, 0, 0, 1 }
回答2:
You are misunderstating how it works. Ip address consists of 4 bytes, representing them as 127.0.0.1
is just a human readable convention. Under the hood, 127.0.0.1 is represented as ((127 << 24) | (0 << 16) | (0 << 8) | 1)
.
In your case, it would be much easier and more readable to just use .Parse(string)
method like this:
IPAddress.Parse("127.0.0.1");
回答3:
Why not try the IPAddress.Parse method?
You'd do something like:
Dim ipAddr as IPAddress = IPAddress.Parse("127.0.0.1")
来源:https://stackoverflow.com/questions/6929487/system-net-ipaddress-returning-weird-addresses