IP地址转换与域名解析

IP地址转换与域名解析相关的类都在System.Net命名空间下

IP地址与端口

1.在网络上,识别远程主机的信息主要由两部分组成:
①主机标识:识别与本地计算机通信的是哪台远程主机;
②端口号:识别和远程主机的哪个进程通信。
2.IP地址:在因特网中,每台联网的主机都在全世界范围内唯一的标识。
3.端口:IP地址仅仅能够识别到某台主机,而不能识别该主机上的进程;端口(port)
识别是哪个进程。

(一)IP地址(11.一个IP地址主要由两部分组成:
(1)网络号:识别该地址所属的网络,它由Internet权利机构分配。
(2)主机号:指明网络内的主机,它由各个网络的管理员统一分配。
2.IPv4编址方案
^4个字节(十进制表示)组成的二进制值进行识别,中间用圆点分开,这种方法叫做
 点分十进制 表示法。
^例如:192.168.1.1   127.0.0.1
3.IPv6编址方案
^每个IP地址有16个字节(128位二进制数),其完整格式用816进制表示,各段之间用
冒号分隔。多个连续的0可以用::表示。
^例如:00000001   可以简写为::1
(一)IP地址(21.子网掩码:子网掩码用于屏蔽IP地址的一部分以区别网络标识和主机标识。
2.子网掩码把所有的网络位(二进制)用1来标识,主机位用0来标识。
^例如:如果将子网掩码设置为255.255.255.0,则对于IP地址192.168.1.X,其网络标识
部分为192.168.1;主机标识为:X3.可以利用子网掩码判断两台计算机是否在同一子网内。(具体操作:将其IP地址和子网
掩码做按位与运算,如果得到结果相同即在同一个子网内。)
(二)端口
1.端口有两种含义:
①物理意义上的端口,如ADSL Modem、集线器的接口;
②逻辑意义上的端口,即进程标识,端口号的范围从065535,比如用于HTTP80端口,
用于FTP21端口等。
2.在网络编程研究中的端口均值逻辑意义上的端口。
^端口是为了解决与多个进程同时进行通信问题。
3.可用端口地址的范围是十进制的0~65535^端口地址用两字节二进制数来表示;
^1000以内的端口号大多被标准协议所占用;
^应用程序中可以自由使用的端口号一般都使用大于1000的值。

IP地址转换相关类

复杂的网络应用程序中,需要掌握几个最基本的类:
①提供网际协议IP地址的IPAddress类;
②包含IP地址和端口号的IPEndPoint类;
③为Internet或Intranet主机提供信息容器的IPHostEntry类。
1.IPAddress类(1/2)
^IPAddress位于System.Net命名空间下,提供了对IP地址的转换和处理功能。
^常用方法:Parse方法将IP地址字符串转换为IPAddress的实例。例如:

Try
{
    IPAddress ip = IPAddress.Parse("143.24.20.36");
}
Catch
{
    MessageBox.Show("请输入正确的IP地址!");
}

IPAddress类(2/2)
^利用该实例的AddressFamily属性可判断该IP地址是IPv6还是IPv4。

IPAddress ip = IPAddress.Parse("::1");
if (ip.AddressFamily == AddressFamily.InterNetworkV6)
{
    MessageBox.Show("这是IPv6地址");
}

IPAddress类还提供了7个只读字段,分别代表程序中使用的特殊IP地址。

IPAddress类常见只读字段
在这里插入图片描述
2.IPEndPoint类
^IPEndPoint描述应用程序连接到主机上的服务所需的主机和端口信息。
^IPEndPoint类的常用构造函数为:

public IPEndPoint(IPAddress address, int port);
第一个参数指定IP地址,第二个参数指定端口号。

例如:
IPAddress localAddress = IPAddress.Parse("192.168.1.1");
IPEndPoint iep = new IPEndPoint(localAddress, 65000);
string s1 = "IP地址为:" + iep.Address;
string s2 = "IP端口为:" + iep.Port;

3.IPHostEntry类
^IPHostEntry类将一个域名系统(DNS)的主机名与一组别名和一组匹配的IP地址关联。该类一般和Dns类一起使用。
^常用属性
AddressList属性
获取或设置与主机关联的IP地址列表(包括IPv4和IPv6)
^HostName属性
包含了指定主机的主机名
Dns类的静态方法GetHostEntry()能够获得IPHostEntry对象。
例如:

IPAddress[] ips = Dns.GetHostEntry(“news.sohu.com”).AddressList;

域名解析

在这里插入图片描述
在这里插入图片描述
网络主机是使用IP地址来定位的
域名比纯数字的IP地址更容易记忆
IP地址改变后,域名不变,仍可访问。
DNS(Domain Name System)完成域名到IP的转换

DNS的解析过程:
^DNS是一种典型的C/S结构。
^由Client向指定的DNS Server发出DNS请求报文,Server收到该请求报文之后,会回给
Client一个应答报文,满足Client的域名解析要求。

Dns类常用方法
在这里插入图片描述
(1)GetHostAddresses方法

^利用GetHostAddresses方法可以获取指定主机的IP地址,该方法返回一个IPAddress类型
的数组。
^方法原型为:
public static IPAddress[] GetHostAddresses(string hostNameOrAddress);
参数中的hostNameOrAddress表示要解析的主机名或IP地址。
例如:
IPAddress[] ips = Dns.GetHostAddresses("www.cctv.com");

^若hostNameOrAddress是IP地址,则直接返回此地址;若hostNameOrAddress是空字符
串,则返回本机所有IPv4和IPv6地址。例如:
IPAddress[] ips = Dns.GetHostAddresses(""); //获取本机的所有IP地址

(2)GetHostEntry方法

^GetHostEntry方法可返回一个IPHostEntry实例,用于在DNS服务器中查询与某个主机名
或IP地址关联的IP地址列表。
^方法原型为
public static IPHostEntry GetHostEntry (string hostNameOrAddress)
参数中的hostNameOrAddress表示要解析的主机名或IP地址。
^当参数为空字符串时,返回本地主机的IPHostEntry实例。
例如:
IPHostEntry host = Dns.GetHostEntry("");
var ipAddresses = host.AddressList;  //获取本机所有IP地址
string name = host.HostName;        //获取本机主机名

(3)GetHostName方法

该方法用于获取本机主机名。
例如:
string hostname = Dns.GetHostName( );

代码分析

在这里插入图片描述

1)
StringBuilder sb = new StringBuilder();
sb.AppendLine("获取www.cctv.com的所有IP地址:");
try  {
    IPAddress[] ips = Dns.GetHostAddresses("www.cctv.com");
    foreach (IPAddress ip in ips)
    {  sb.AppendLine(ip.ToString());  }
     }
      catch (Exception ex)
            {   MessageBox.Show(ex.Message,"获取失败");    }2)
string hostName = Dns.GetHostName();
sb.AppendLine("获取本机所有IP地址:");
 IPHostEntry me = Dns.GetHostEntry(hostName);
 foreach (IPAddress ip in me.AddressList)
  { if (ip.AddressFamily == AddressFamily.InterNetwork)
         {   sb.AppendLine("IPv4:" + ip.ToString());   }
     else if (ip.AddressFamily == ddressFamily.InterNetworkV6)
         {  sb.AppendLine("IPv6:" + ip.ToString());    }
     else   {    sb.AppendLine("其他:" + ip.ToString());  }
    }3)
IPAddress localip = IPAddress.Parse("::1"); //IPv6回路测试地址
 Output(sb, localip);
 IPAddress localip1 = IPAddress.Parse("127.0.0.1");//IPv4回路测试地址
 Output(sb, localip1);
  textBlock1.Text = sb.ToString();
 }4private static void Output(StringBuilder sb, IPAddress localip)
 { 
    IPEndPoint iep = new IPEndPoint(localip, 80);
    if (localip.AddressFamily == AddressFamily.InterNetworkV6)
    { sb.Append("IPv6端点: " + iep.ToString());  }
    else {sb.Append("IPv4端点: " + iep.ToString());  }
    sb.Append(",端口 " + iep.Port);
    sb.Append(",地址 " + iep.Address);
    sb.AppendLine(",地址族 " + iep.AddressFamily);
  }

在这里插入图片描述

特别注意

仅供参考学习,转载请附上原文链接
图片来源于网络、个人收藏、个人制作
该篇文章不做任何商业用途,纯属分享学习心得,如有侵权,望联系本人处理
还在读大学的程序员,项目经验少,如有纰漏,感谢指正
需要源代码请私聊联系本人
谢谢配合

如果这篇文章对您有帮助,小小的点个赞,算是给小学弟的鼓励吧!谢谢大佬!!/呱呱.jpg

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值