博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】C# Socket编程(2)识别网络主机
阅读量:7239 次
发布时间:2019-06-29

本文共 3264 字,大约阅读时间需要 10 分钟。

【转自:】

一个客户端想要发起一次通信,先决条件就是需要知道运行着服务器端程序的主机的IP地址是多少,端口号是多少。然后我们才能够通过这个地址向服务器特定的应用程序发送信息。对于网络上的两台计算机来说,用户操作的计算机称为本地主机,与该计算机通信的另一台计算机称为远程主机。识别远程主机依靠两部分组成:一是主机标识,用于识别与本地主机通信的远程主机;二是端口号,用于识别是再和远程主机中的哪个进程通信。     

1.获取主机地址信息  

  在C#开发中命名空间为网络上使用的多种协议提供了简单的编程接口。我们可以利用这个命名空间下的类,编写基于网络标准协议的应用程序时,不必去考虑各种不同协议的具体细节。在获取主机(local和remote)地址信息时,我们需要使用和学习这几个最基本的类(更加详细API可以参考MSDN,下面会给出对应链接),用它们来实现相关的功能。

  • 提供网际协议的IP地址的类
  • 包含IP地址和端口号的类
  • 为Internet主机提供信息容器的类
  • 提供简单的域名解析功能的类

  说千遍不如做一遍,学习编程的最好方式就是自己动手实践,下面我们通过创建一个简单的Windows Forms示例程序(下载地址在博文末尾)来学习如何获取网络主机的地址信息,下面是示例的示例代码主要代码:

 

//获取本地主机名            string localHostName = Dns.GetHostName();            //通过主机名获取该主机下存储所有IP地址信息的容器            IPHostEntry local = Dns.GetHostEntry(HostName);            //通过IPHostEntry对象的AddressList属性获取相关联主机的所有IP地址            IPAddress[] ipList = local.AddressList;            //获取本机回环地址            IPAddress loopbackIP = IPAddress.Loopback;            //通过它Parse函数构造IPAddress对象            IPAddress localIp = IPAddress.Parse("192.168.1.101");            //通过IPAddress对象和端口号构造IPEndPoint对象            IPEndPoint iep = new IPEndPoint(localIp, 80);

 

   查看运行示例程序效果:

  

2.获取网卡信息和网络检测

  网络适配器又被称为网卡或者网络接口卡(NIC),是连接计算机和网络的硬件设备。网卡主要的工作原理是:整理计算机发往信道上的数据,并将数据分解为适当大小的数据包之后向网络上发送。在.NET开发中我们使用命名空间获取:网络流量数据、网络地址信息和本地计算机的地址更改通知等信息。 该命名空间还包含实现 Ping 实用工具的类。 可以使用 Ping 和相关的类检查是否可通过网络连接到计算机。

2.1 获取网卡信息

  获取网卡信息、网络连接和网络速度以及网络协议版本(包括:IPv4和IPv6)的网络接口信息,我们使用下面的两个类:

  1. 类:提供了访问主机所有接口的信息的功能。利用该类我们可以方便的检测本机有多少个网卡、哪些网络连接可用、并获取某个网卡的型号、Mac地址和速度等信息。
  2. 类:可用于访问支持 IPv4 或 IPv6 的网络接口的配置和地址信息。该类是一个抽象类,不能直接创建,使用返回实例。

  下面我们通过一个简单的Windows Forms示例程序来学习如何获取网络接口的配置和统计信息,主要代码如下:

//获取主机上所有的网络适配器对象数组            NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();            //获取该网络适配器的配置对象            IPInterfaceProperties adapterProperties = adapters[i].GetIPProperties();            //获取并该网络适配器DNS服务器地址信息            IPAddressCollection dnsServers = adapterProperties.DnsAddresses;

   运行实例程序效果:

  

2.2 网络流量检测

  我们可以使用System.Net.NetworkInformation命名空间的类获取网络适配器接收、转发、丢弃、发送的数据包数目,该类提供有关本地计算机的网络连接的信息。检测网络流量是我们通过使用IPGlobalProperties类的方法获取记录本地计算机的网络连接和通信统计数据的信息的对象实例,通过实例的属性来获取相关信息,达到检测网络流量的目的:

 

//获取包含本机的网络连接和通信统计数据的信息的对象           IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();             //获取本机IPv4统计数据            IPGlobalStatistics ipstate = properties.GetIPv4GlobalStatistics();

 

   下面我们还是通过上面的代码来创建一个小例子来学习如何检测网络流量,程序运行效果如下:

  

2.3 网络连接检测

  我们知道可以利用CMD命令行中输入的ping命令,通过调用ping.exe命令行程序来检测网络连接,能够快速判断出网络故障。在.NET开发环境中我们可以通过使用命名空间下的类、类和类来实现类似于ping.exe命令行的功能。

  • Ping类可以确定应用程序确定是否可通过网络访问远程计算机
  • PingOptions类用于控制如何传输 Ping 数据包
  • PingReply类提供有关 Send 或 SendAsync 操作的状态及产生的数据的信息。

示例程序主要代码如下:

//获取主机地址            string hostAddress = this.txt_HostAddress.Text.Trim();            //构造Ping实例            Ping pingSender = new Ping();            //Ping选项设置            PingOptions options = new PingOptions();            options.DontFragment = true;            //测试数据            string testData = "Test Data";            byte[] buffer = Encoding.ASCII.GetBytes(testData);            //设置超时时间            int timeout = 120;            //调用同步的Send方法发送数据,将结果保存至PingReply实例            PingReply reply = pingSender.Send(hostAddress, timeout, buffer, options);

  示例程序运行效果:

  

 

示例下载:

转载于:https://www.cnblogs.com/peterYong/p/6556739.html

你可能感兴趣的文章
head命令
查看>>
java基础复习二——面向对象一
查看>>
shell语法简单介绍
查看>>
护眼色的RGB值
查看>>
无法识别的属性“targetFramework”。请注意属性名称区分大写和小写。错误解决的方法...
查看>>
EJB究竟是什么,真的那么神奇吗??
查看>>
Android入门第八篇之GridView(九宫图)
查看>>
浅谈MySQL外键
查看>>
java中instanceof用法
查看>>
OC学习总结之面向对象和类
查看>>
atitit.软件开发GUI 布局管理优缺点总结java swing wpf web html c++ qt php asp.net winform
查看>>
《SQL Server企业级平台管理实践》读书笔记——SQL Server中关于系统库Tempdb总结...
查看>>
如何提高SELECT的效率
查看>>
Unity手游之路<四>3d旋转-四元数,欧拉角和变幻矩阵
查看>>
scala编程第17章学习笔记(1)——集合类型
查看>>
重构if...else...或者switch程序块
查看>>
模板继承
查看>>
Provide your license server administrator with the following information.error code =-42,147
查看>>
careercup-递归和动态规划 9.4
查看>>
设置Ubuntu Mysql可以远程链接
查看>>