A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵宗荣 中级黑马   /  2013-7-10 10:34  /  2019 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

哪位大神能够解释一下socket中IPAddress的用法?
IPAddress address = IPAddress.Parse(txt_IP.Text.Trim());

点评

要不要爷给你解释一下啊  发表于 2013-7-10 12:00

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

5 个回复

正序浏览
public static IPAddress Parse(string ipString)这个是IPAddress类的一个静态方法,可以将 IP 地址字符串转换为 System.Net.IPAddress 实例。
// 参数:
//   ipString:
//     包含 IP 地址(IPv4 使用以点分隔的四部分表示法,IPv6 使用冒号十六进制表示法)的字符串。
//
// 返回结果:
//     一个 System.Net.IPAddress 实例。它内部是这样的
  1. public static IPAddress Parse(string ipString)
  2. {
  3.     return InternalParse(ipString, false);
  4. }
复制代码
最终是调用.NET内部封转的方法,方法内容如下:
  1. private static unsafe IPAddress InternalParse(string ipString, bool tryParse)
  2. {
  3.     long num7;
  4.     if (ipString == null)
  5.     {
  6.         if (!tryParse)
  7.         {
  8.             throw new ArgumentNullException("ipString");
  9.         }
  10.         return null;
  11.     }
  12.     if (ipString.IndexOf(':') != -1)
  13.     {
  14.         SocketException innerException = null;
  15.         if (Socket.OSSupportsIPv6)
  16.         {
  17.             byte[] buffer = new byte[0x10];
  18.             SocketAddress address = new SocketAddress(AddressFamily.InterNetworkV6, 0x1c);
  19.             if (UnsafeNclNativeMethods.OSSOCK.WSAStringToAddress(ipString, AddressFamily.InterNetworkV6, IntPtr.Zero, address.m_Buffer, ref address.m_Size) == SocketError.Success)
  20.             {
  21.                 for (int i = 0; i < 0x10; i++)
  22.                 {
  23.                     buffer[i] = address[i + 8];
  24.                 }
  25.                 return new IPAddress(buffer, (((address[0x1b] << 0x18) + (address[0x1a] << 0x10)) + (address[0x19] << 8)) + address[0x18]);
  26.             }
  27.             if (tryParse)
  28.             {
  29.                 return null;
  30.             }
  31.             innerException = new SocketException();
  32.         }
  33.         else
  34.         {
  35.             int start = 0;
  36.             if (ipString[0] != '[')
  37.             {
  38.                 ipString = ipString + ']';
  39.             }
  40.             else
  41.             {
  42.                 start = 1;
  43.             }
  44.             int end = ipString.Length;
  45.             fixed (char* str2 = ((char*) ipString))
  46.             {
  47.                 char* name = str2;
  48.                 if (IPv6AddressHelper.IsValidStrict(name, start, ref end) || (end != ipString.Length))
  49.                 {
  50.                     uint num5;
  51.                     ushort[] numArray = new ushort[8];
  52.                     string scopeId = null;
  53.                     fixed (ushort* numRef = numArray)
  54.                     {
  55.                         IPv6AddressHelper.Parse(ipString, numRef, 0, ref scopeId);
  56.                     }
  57.                     if ((scopeId == null) || (scopeId.Length == 0))
  58.                     {
  59.                         return new IPAddress(numArray, 0);
  60.                     }
  61.                     if (uint.TryParse(scopeId.Substring(1), NumberStyles.None, null, out num5))
  62.                     {
  63.                         return new IPAddress(numArray, num5);
  64.                     }
  65.                 }
  66.             }
  67.             if (tryParse)
  68.             {
  69.                 return null;
  70.             }
  71.             innerException = new SocketException(SocketError.InvalidArgument);
  72.         }
  73.         throw new FormatException(SR.GetString("dns_bad_ip_address"), innerException);
  74.     }
  75.     Socket.InitializeSockets();
  76.     int length = ipString.Length;
  77.     fixed (char* str3 = ((char*) ipString))
  78.     {
  79.         char* chPtr2 = str3;
  80.         num7 = IPv4AddressHelper.ParseNonCanonical(chPtr2, 0, ref length, true);
  81.     }
  82.     if ((num7 == -1L) || (length != ipString.Length))
  83.     {
  84.         if (!tryParse)
  85.         {
  86.             throw new FormatException(SR.GetString("dns_bad_ip_address"));
  87.         }
  88.         return null;
  89.     }
  90.     return new IPAddress(((num7 & 0xffL) << 0x18) | (((num7 & 0xff00L) << 8) | (((num7 & 0xff0000L) >> 8) | ((long) ((num7 & 0xff000000L) >> 0x18)))));
  91. }

复制代码
一般开发中我们不需要知道.NETFrameWork的内部工作原理,微软为我们封转好了,我们直接在此基础上编程调用即可,这也是面向对象的好处!

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
  1. IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());//这个IPHostEntry类是为主机地址提供容器类 不可能所有的ip都是要自己手写进去通过Dns.GetHostName() 去获取计算机名  然后再通过Dns.GetHostEntry();自动通过里面所传的参数见IP地址解析为IPHostEntry的实例
  2.             IPAddress ip = hostEntry.AddressList[1];//一台机子为什么会有不同的ip地址,就是因为电脑有不同的网卡,若是开了无线网也可以获取更多的ip地址,那我们本机的ip地址就是自动获取的得到的,也就是说ip不再是127.0.0.1了而是其他的了,那么IPAddressde 的用法也就明了了
复制代码

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
还有啥用,除了表示这个对象
回复 使用道具 举报
建立与远程主机的连接。主机由 IP 地址和端口号指定
IPAddress ip = IPAddress.Parse(txt);//可用来获得ip地址,(txt中的内容类型例如“127.0.0.1”)
IPAddress 中包含计算机的IP地址。Parse用于将 IP 地址字符串转换为 IPAddress ,例如IPAddress myIP = IPAddress.Parse("127.0.0.1");  
现在只是知道这些
同候最佳答案{:soso_e113:}

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马