.NET 4.0网络开发入门之旅--
我在网 中央(上)
注:
这是一个针对网络开发领域初学者
的系列文章,可作为《.NET 4.0 面向对象编程漫谈 》一书的扩充阅读,写作过程中我假设读者可以对照阅读此书的相关章节,不再浪费笔墨重复介绍相关的内容。
对于其他类型的读者,除非您已经有相应的.NET 技术背景与一定的开发经验,否则,阅读中可能会遇到困难。
我希望这系列文章能让读者领略到网络开发的魅力!
另外,这些文章均为本人原创,请读者尊重作者的劳动,我允许大家出于知识共享的目的自由转载这些文章及相关示例,但未经本人许可,请不要用于商业盈利目的。
本文如有错误,敬请回贴指正。
谢谢大家!
金旭亮
=================================================
点击以下链接阅读本系列前面的文章:
《.NET 4.0 网络开发入门之旅系列文章 开篇语 无网不胜》
《.NET 4.0网络开发入门之旅IP知多少》
1 引子
我相信几乎所有人都知道,Windows操作系统能自动检测出是否本地计算机已经连上网络,并且在任务栏右下角会显示相应的图标(图 1):
图 1
对于软件开发者而言,这一功能是比较有用的。比如,你可以在用户连上互联网时,自动检测你所开发的软件是否有更新。
下面我们就聊聊如何在.NET应用软件中克隆Windows的这一功能。
2 你到底有几个好妹妹?
不要误会,我不是在教大家唱孟庭苇的这首歌,只是活跃一下气氛罢了。 :)
在这里引用这句歌词,其目的是引出这样的一个问题:
怎样知道本地计算机中安装了几块网卡?
为什么要知道这个问题的答案?
很简单,因为你要想知道计算机是否联上了网。
当前的计算机不少都拥有两块以上的网卡,最典型的是笔记本,我们通常有两种方式联网:直接插入网线和使用无线路由器上网。在实际场景中也经常出现两种方 式混用的情况(本地局域网的网线插上了,同时并未关闭无线网卡)。Windows很聪明,不管是不是同时混用这两种方式,只要有一个网卡可以连通 Internet,它就认为互联网是可达的。
这里要说说网卡这个概念。
网卡其实是一种通俗叫法,真正的术语是 网络接口(Network Interface)
,以下是在维基百科(Wikipedia)上找到的一段说明文字:
Network interface may refer to: Network interface controller(即NIC), the device a computer uses to connect to a computer network.
在网络应用开发中通常使用网络接口这一术语,当然,你将它理解为网卡,问题也不大,你不需要写Paper而是要写程序。
.NET基类库的System.Net.NetworkInformation命名空间中提供了一组类,可以方便地获取各种网络信息。
以下这句代码获取本机的所有网络接口:
NetworkInterface[]nics=NetworkInterface.GetAllNetworkInterfaces();
每个NetworkInterface对象都代表着本机的一个真实网络接口。
获取NetworkInterface对象之后,通过它的属性可以获取丰富的网络信息。
以下方法显示一个网络接口的基本信息(参看示例程序GetLocalhostInformation):
获取网络接口信息privatestaticvoidShowNetworkInterfaceBasicInfo(NetworkInterfacenic)
{
Console.WriteLine("名字(Name):{0}",nic.Name);
Console.WriteLine("描述(Description):{0}",nic.Description);
Console.WriteLine("id:{0}",nic.Id);
Console.WriteLine("物理地址:{0}",BitConverter.ToString(
nic.GetPhysicalAddress().GetAddressBytes()));
Console.WriteLine("是否仅接收数据包(IsReceiveOnly):{0}",
nic.IsReceiveOnly);
Console.WriteLine("类型(NetworkInterfaceType):{0}",
nic.NetworkInterfaceType);
Console.WriteLine("是否可接收多播数据包:"+nic.SupportsMulticast);
Console.WriteLine("当前操作状态:"+nic.OperationalStatus);
}
以上是上述方法在笔者计算机上的输出:
名字(Name):本地连接
描述(Description):BroadcomNetLink(TM)GigabitEthernet
id:{E0DE0334-1A45-45DE-8259-7A3AD2F7B8DA}
物理地址:F0-4D-A2-DA-70-D7
是否仅接收数据包(IsReceiveOnly):False
类型(NetworkInterfaceType):Ethernet
是否可接收多播数据包:True
当前操作状态:Up
特别注意网络接口的OperationalStatus属性(当前操作状态),为Down的网络接口是不可用的。
通过NetworkInterface对象的GetIPProperties方法可以获取IPInterfaceProperties对象,它包容了一个网络接口与IP相关的所有信息:其中与连网相关的最重要信息是网关和DNS服务器地址:
显示网络接口的IP信息privatestaticvoidShowNetworkInterfaceIPProperties(NetworkInterfacenic)
{
IPInterfacePropertiesipProperties=nic.GetIPProperties();
//更多代码略
GatewayIPAddressInformationCollectiongatewayInfo= ipProperties.GatewayAddresses;
foreach(GatewayIPAddressInformationinfoingatewayInfo)
Console.WriteLine("网关(Gateway)地址:{0}",info.Address);
ipAddresses=ipProperties.DnsAddresses;
foreach(IPAddressinfoinipAddresses)
Console.WriteLine("DNSServer地址:{0}",info);
}
以下是笔者计算机中本地网络接口的相关信息:
DNS后缀名:
单播(Unicast)地址:fe80::b0f5:7eaa:3b79:102e%11
单播(Unicast)地址:192.168.1.100
多路广播(Multicast)地址:ff01::1%11
多路广播(Multicast)地址:224.0.0.1
多路广播(Multicast)地址:224.0.0.252
多路广播(Multicast)地址:239.255.255.250
网关(Gateway)地址:192.168.1.1
DHCPServer地址:192.168.1.1
DNSServer地址:192.168.1.1
由于笔者家里采用无线路由器+ADSL宽带上网,所以网关地址和DNS服务器地址都是192.168.1.1,它是无线路由器的默认地址。如果是在一个比较大的局域网中,网关和DNS通常不会相同,而且DNS服务器通常会有两个。
另外,注意IP地址分为单播和多路广播两大类,在后面的文章中会介绍基于多播特性开发的一些典型网络应用程序。
3 Ping
Ping命令可以说是最常用的检测网络连通性的命令了,.NET基类库中提供了一个Ping组件完成这一工。Ping组件用起来很容易,先准备好一个要测试的数据块(不要太大,32字节足矣),然后调用其Send方法将此数据块发送给远程主机:
publicPingReplySend(stringhostNameOrAddress,//要Ping的主机
inttimeout,//最长等待主机发回响应几秒
byte[]buffer,//要发送的数据
PingOptionsoptions//一些可设置的附加参数,详情参看MSDN。
);
Send方法返回一个PingReply对象,检测它的Status属性是否为IPStatus.Succes就可以知道Ping操作是否成功。
我编写了一个UsePingComponent示例程序来Ping远程主机(图 2):
图 2
Ping组件支持EAP异步编程模式,微软提供了一个PingClient示例程序展示了其用法。我在《.NET 4.0面向对象编程漫谈》的第10章《异步编程模式》对EAP有详细介绍,读者只要仔细研读一下10.6节《基于事件的异步调用模式》,看懂PingClient示例程序很容易,此处不再赘述。
===========================
附《.NET4.0面向对象编程漫谈》豆瓣链接http://book.douban.com/subject/5319799/
我在网 中央(上)
注:
这是一个针对网络开发领域初学者
的系列文章,可作为《.NET 4.0 面向对象编程漫谈 》一书的扩充阅读,写作过程中我假设读者可以对照阅读此书的相关章节,不再浪费笔墨重复介绍相关的内容。
对于其他类型的读者,除非您已经有相应的.NET 技术背景与一定的开发经验,否则,阅读中可能会遇到困难。
我希望这系列文章能让读者领略到网络开发的魅力!
另外,这些文章均为本人原创,请读者尊重作者的劳动,我允许大家出于知识共享的目的自由转载这些文章及相关示例,但未经本人许可,请不要用于商业盈利目的。
本文如有错误,敬请回贴指正。
谢谢大家!
金旭亮
=================================================
点击以下链接阅读本系列前面的文章:
《.NET 4.0 网络开发入门之旅系列文章 开篇语 无网不胜》
《.NET 4.0网络开发入门之旅IP知多少》
1 引子
我相信几乎所有人都知道,Windows操作系统能自动检测出是否本地计算机已经连上网络,并且在任务栏右下角会显示相应的图标(图 1):
![](https://i-blog.csdnimg.cn/blog_migrate/f94cce481666c1e7f10c68892bfbd58a.jpeg)
图 1
对于软件开发者而言,这一功能是比较有用的。比如,你可以在用户连上互联网时,自动检测你所开发的软件是否有更新。
下面我们就聊聊如何在.NET应用软件中克隆Windows的这一功能。
2 你到底有几个好妹妹?
不要误会,我不是在教大家唱孟庭苇的这首歌,只是活跃一下气氛罢了。 :)
在这里引用这句歌词,其目的是引出这样的一个问题:
怎样知道本地计算机中安装了几块网卡?
为什么要知道这个问题的答案?
很简单,因为你要想知道计算机是否联上了网。
当前的计算机不少都拥有两块以上的网卡,最典型的是笔记本,我们通常有两种方式联网:直接插入网线和使用无线路由器上网。在实际场景中也经常出现两种方 式混用的情况(本地局域网的网线插上了,同时并未关闭无线网卡)。Windows很聪明,不管是不是同时混用这两种方式,只要有一个网卡可以连通 Internet,它就认为互联网是可达的。
这里要说说网卡这个概念。
网卡其实是一种通俗叫法,真正的术语是 网络接口(Network Interface)
,以下是在维基百科(Wikipedia)上找到的一段说明文字:
Network interface may refer to: Network interface controller(即NIC), the device a computer uses to connect to a computer network.
在网络应用开发中通常使用网络接口这一术语,当然,你将它理解为网卡,问题也不大,你不需要写Paper而是要写程序。
.NET基类库的System.Net.NetworkInformation命名空间中提供了一组类,可以方便地获取各种网络信息。
以下这句代码获取本机的所有网络接口:
NetworkInterface[]nics=NetworkInterface.GetAllNetworkInterfaces();
每个NetworkInterface对象都代表着本机的一个真实网络接口。
获取NetworkInterface对象之后,通过它的属性可以获取丰富的网络信息。
以下方法显示一个网络接口的基本信息(参看示例程序GetLocalhostInformation):
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
{
Console.WriteLine("名字(Name):{0}",nic.Name);
Console.WriteLine("描述(Description):{0}",nic.Description);
Console.WriteLine("id:{0}",nic.Id);
Console.WriteLine("物理地址:{0}",BitConverter.ToString(
nic.GetPhysicalAddress().GetAddressBytes()));
Console.WriteLine("是否仅接收数据包(IsReceiveOnly):{0}",
nic.IsReceiveOnly);
Console.WriteLine("类型(NetworkInterfaceType):{0}",
nic.NetworkInterfaceType);
Console.WriteLine("是否可接收多播数据包:"+nic.SupportsMulticast);
Console.WriteLine("当前操作状态:"+nic.OperationalStatus);
}
以上是上述方法在笔者计算机上的输出:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
描述(Description):BroadcomNetLink(TM)GigabitEthernet
id:{E0DE0334-1A45-45DE-8259-7A3AD2F7B8DA}
物理地址:F0-4D-A2-DA-70-D7
是否仅接收数据包(IsReceiveOnly):False
类型(NetworkInterfaceType):Ethernet
是否可接收多播数据包:True
当前操作状态:Up
特别注意网络接口的OperationalStatus属性(当前操作状态),为Down的网络接口是不可用的。
通过NetworkInterface对象的GetIPProperties方法可以获取IPInterfaceProperties对象,它包容了一个网络接口与IP相关的所有信息:其中与连网相关的最重要信息是网关和DNS服务器地址:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
{
IPInterfacePropertiesipProperties=nic.GetIPProperties();
//更多代码略
GatewayIPAddressInformationCollectiongatewayInfo= ipProperties.GatewayAddresses;
foreach(GatewayIPAddressInformationinfoingatewayInfo)
Console.WriteLine("网关(Gateway)地址:{0}",info.Address);
ipAddresses=ipProperties.DnsAddresses;
foreach(IPAddressinfoinipAddresses)
Console.WriteLine("DNSServer地址:{0}",info);
}
以下是笔者计算机中本地网络接口的相关信息:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
单播(Unicast)地址:fe80::b0f5:7eaa:3b79:102e%11
单播(Unicast)地址:192.168.1.100
多路广播(Multicast)地址:ff01::1%11
多路广播(Multicast)地址:224.0.0.1
多路广播(Multicast)地址:224.0.0.252
多路广播(Multicast)地址:239.255.255.250
网关(Gateway)地址:192.168.1.1
DHCPServer地址:192.168.1.1
DNSServer地址:192.168.1.1
由于笔者家里采用无线路由器+ADSL宽带上网,所以网关地址和DNS服务器地址都是192.168.1.1,它是无线路由器的默认地址。如果是在一个比较大的局域网中,网关和DNS通常不会相同,而且DNS服务器通常会有两个。
另外,注意IP地址分为单播和多路广播两大类,在后面的文章中会介绍基于多播特性开发的一些典型网络应用程序。
3 Ping
Ping命令可以说是最常用的检测网络连通性的命令了,.NET基类库中提供了一个Ping组件完成这一工。Ping组件用起来很容易,先准备好一个要测试的数据块(不要太大,32字节足矣),然后调用其Send方法将此数据块发送给远程主机:
publicPingReplySend(stringhostNameOrAddress,//要Ping的主机
inttimeout,//最长等待主机发回响应几秒
byte[]buffer,//要发送的数据
PingOptionsoptions//一些可设置的附加参数,详情参看MSDN。
);
Send方法返回一个PingReply对象,检测它的Status属性是否为IPStatus.Succes就可以知道Ping操作是否成功。
我编写了一个UsePingComponent示例程序来Ping远程主机(图 2):
![](https://i-blog.csdnimg.cn/blog_migrate/b02597978d890ec2a0e29d65ef5790b4.jpeg)
图 2
Ping组件支持EAP异步编程模式,微软提供了一个PingClient示例程序展示了其用法。我在《.NET 4.0面向对象编程漫谈》的第10章《异步编程模式》对EAP有详细介绍,读者只要仔细研读一下10.6节《基于事件的异步调用模式》,看懂PingClient示例程序很容易,此处不再赘述。
===========================
附《.NET4.0面向对象编程漫谈》豆瓣链接http://book.douban.com/subject/5319799/