diff --git a/nanoFramework.System.Net/IPAddress.cs b/nanoFramework.System.Net/IPAddress.cs index e74e75c..c65df3d 100644 --- a/nanoFramework.System.Net/IPAddress.cs +++ b/nanoFramework.System.Net/IPAddress.cs @@ -6,6 +6,7 @@ using System.Net.NetworkInformation; using System.Net.Sockets; +using System.Runtime.CompilerServices; namespace System.Net { @@ -133,38 +134,7 @@ public byte[] GetAddressBytes() /// public static IPAddress Parse(string ipString) { - if (ipString == null) - throw new ArgumentNullException(); - - ulong ipAddress = 0L; - int lastIndex = 0; - int shiftIndex = 0; - ulong mask = 0x00000000000000FF; - ulong octet = 0L; - int length = ipString.Length; - - for (int i = 0; i < length; ++i) - { - // Parse to '.' or end of IP address - if (ipString[i] == '.' || i == length - 1) - // If the IP starts with a '.' - // or a segment is longer than 3 characters or shiftIndex > last bit position throw. - if (i == 0 || i - lastIndex > 3 || shiftIndex > 24) - { - throw new ArgumentException(); - } - else - { - i = i == length - 1 ? ++i : i; - octet = ulong.Parse(ipString.Substring(lastIndex, i - lastIndex)) & 0x00000000000000FF; - ipAddress = ipAddress + ((octet << shiftIndex) & mask); - lastIndex = i + 1; - shiftIndex = shiftIndex + 8; - mask = (mask << 8); - } - } - - return new IPAddress((long)ipAddress); + return new IPAddress(NetworkInterface.IPAddressFromString(ipString)); } /// @@ -179,13 +149,7 @@ public static IPAddress Parse(string ipString) /// public override string ToString() { - return ((byte)(Address)).ToString() + - "." + - ((byte)(Address >> 8)).ToString() + - "." + - ((byte)(Address >> 16)).ToString() + - "." + - ((byte)(Address >> 24)).ToString(); + return IPv4ToString((uint)Address); } /// @@ -230,5 +194,12 @@ internal IPAddress Snapshot() throw new NotSupportedException(); } + + #region native methods + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern string IPv4ToString(uint ipv4Address); + + #endregion } } diff --git a/nanoFramework.System.Net/NetworkInformation/NetworkInterface.cs b/nanoFramework.System.Net/NetworkInformation/NetworkInterface.cs index df292e8..46be569 100644 --- a/nanoFramework.System.Net/NetworkInformation/NetworkInterface.cs +++ b/nanoFramework.System.Net/NetworkInformation/NetworkInterface.cs @@ -96,19 +96,6 @@ public static NetworkInterface[] GetAllNetworkInterfaces() return ifaces; } - private string IPv4AddressToString(uint ipv4Address) - { - return string.Concat( - ((ipv4Address >> 0) & 0xFF).ToString(), - ".", - ((ipv4Address >> 8) & 0xFF).ToString(), - ".", - ((ipv4Address >> 16) & 0xFF).ToString(), - ".", - ((ipv4Address >> 24) & 0xFF).ToString() - ); - } - private string IPv6AddressToString(uint[] ipv6Address) { throw new NotImplementedException(); @@ -134,9 +121,9 @@ public void EnableStaticIPv4(string ipv4Address, string ipv4SubnetMask, string i { try { - _ipv4Address = IPAddressFromString(ipv4Address); - _ipv4NetMask = IPAddressFromString(ipv4SubnetMask); - _ipv4GatewayAddress = IPAddressFromString(ipv4GatewayAddress); + _ipv4Address = (uint)IPAddressFromString(ipv4Address); + _ipv4NetMask = (uint)IPAddressFromString(ipv4SubnetMask); + _ipv4GatewayAddress = (uint)IPAddressFromString(ipv4GatewayAddress); _startupAddressMode = AddressMode.Static; UpdateConfiguration((int)UpdateOperation.Dhcp); @@ -190,9 +177,9 @@ public void EnableStaticIP(string ipv4Address, string ipv4subnetMask, string ipv { throw new NotImplementedException(); - _ipv4Address = IPAddressFromString(ipv4Address); - _ipv4NetMask = IPAddressFromString(ipv4subnetMask); - _ipv4GatewayAddress = IPAddressFromString(ipv4gatewayAddress); + _ipv4Address = (uint)IPAddressFromString(ipv4Address); + _ipv4NetMask = (uint)IPAddressFromString(ipv4subnetMask); + _ipv4GatewayAddress = (uint)IPAddressFromString(ipv4gatewayAddress); // FIXME // need to test this @@ -242,7 +229,7 @@ public void EnableStaticIPv4Dns(string[] dnsAddresses) int iAddress = 0; for (int i = 0; i < dnsAddresses.Length; i++) { - uint address = IPAddressFromString(dnsAddresses[i]); + uint address = (uint)IPAddressFromString(dnsAddresses[i]); addresses[iAddress] = address; @@ -351,7 +338,7 @@ public bool IsAutomaticDnsEnabled /// public string IPv4Address { - get { return IPv4AddressToString(_ipv4Address); } + get { return IPAddress.IPv4ToString(_ipv4Address); } } /// @@ -359,7 +346,7 @@ public string IPv4Address /// public string IPv4GatewayAddress { - get { return IPv4AddressToString(_ipv4GatewayAddress); } + get { return IPAddress.IPv4ToString(_ipv4GatewayAddress); } } /// @@ -367,7 +354,7 @@ public string IPv4GatewayAddress /// public string IPv4SubnetMask { - get { return IPv4AddressToString(_ipv4NetMask); } + get { return IPAddress.IPv4ToString(_ipv4NetMask); } } /// @@ -390,12 +377,12 @@ public string[] IPv4DnsAddresses if (_ipv4dnsAddress1 != 0) { - list.Add(IPv4AddressToString(_ipv4dnsAddress1)); + list.Add(IPAddress.IPv4ToString(_ipv4dnsAddress1)); } if (_ipv4dnsAddress2 != 0) { - list.Add(IPv4AddressToString(_ipv4dnsAddress2)); + list.Add(IPAddress.IPv4ToString(_ipv4dnsAddress2)); } return (string[])list.ToArray(typeof(string)); @@ -489,7 +476,7 @@ public NetworkInterfaceType NetworkInterfaceType private extern void UpdateConfiguration(int updateType); [MethodImpl(MethodImplOptions.InternalCall)] - private static extern uint IPAddressFromString(string ipAddress); + internal static extern long IPAddressFromString(string ipAddress); #endregion } diff --git a/nanoFramework.System.Net/Properties/AssemblyInfo.cs b/nanoFramework.System.Net/Properties/AssemblyInfo.cs index 6215019..a5c758d 100644 --- a/nanoFramework.System.Net/Properties/AssemblyInfo.cs +++ b/nanoFramework.System.Net/Properties/AssemblyInfo.cs @@ -12,7 +12,7 @@ //////////////////////////////////////////////////////////////// // update this whenever the native assembly signature changes // -[assembly: AssemblyNativeVersion("100.1.3.2")] +[assembly: AssemblyNativeVersion("100.1.3.3")] //////////////////////////////////////////////////////////////// // Setting ComVisible to false makes the types in this assembly not visible