C#网络编程——网络应用编程

网络编程——第一章

1.1 网络应用编程模型

**数据通信模式:**分散式系统、集中式系统、分布系统式

  • 在分布式系统的基础上进一步抽象出来的编程模型:

    • C/S模式(Client/Server):

      • 主要特点:胖客户端应用程序变成架构,主要工作都是在客户端完成

      • C/S模式将网络事务处理分为两部分 客户端和服务端Client用于位用户提供操作,通识向网络提供请求服务, Server负责接受并处理客户端发出的服务请求,将处理结果返回客户端

        编写服务端应用程序建议使用WCF,客户端建议使用WPF

    • P2P模式(peer to peer)

    • B/S(Browse/Server):B/S模式的应用程序也叫WEB应用程序

      • 仅用HTTP(Hypertext Transfer Protocol,超文本传输协议)进行通信

      • 优点:单台计算机可以访问认可Web服务器

      • 采用三层架构:

1.2 TCP/IP网络协议

TCP/IP四层协议中将五层结构中的物理层和数据链路层的功能全都放到了网络接口层中,五层结构主要是将OSI中的会话层和表示层放到了应用层中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j5Cm0PdF-1587011641639)(https://img2018.cnblogs.com/blog/1941724/202002/1941724-20200229164237727-1018421075.png)]

数据链路层之间传输的是真

网络层发送的是数据报 给数据加上IP得知

传输层给数据加上端口号

  • 应用层:负责应用程序之间的沟通,主要协议有简单SMTP(邮件传输)、FTP(文件传输协议)、Telnet(网络远程访问协议)

  • 传输层:该层提供节点间的数据传送以及应用程序之间的通信服务,主要功能是格式化数据、数据确认和丢失重传等,把数据报加入传输数据并把它传送到下一层中。主要协议有:TCP(传输控制协议)、UDP(用户数据报协议) TCP是面向连接的 UDP无连接

  • 网际层:主要功能是把数据报通过最佳路径送到目的端,不检查数据包是否被正常接收,核心协议——ip协议

  • 网路接口层层:mac地址 完成点到点的运输 扶着接收ip数据报转交给下一层。

1.3 传统的网络编程技术

1. 套接字编程(socket)(作用在网络层和传输层之间的)

  • ​ 套接字是支持TCP/IP网络通信的基本操作单元
    • 一个套接字实例中保存有本地的IP地址和端口、对方的IP地址和端口、双方通信才有的网络协议等信息
  • 套接字的三种不同类型:
    • 流式套接字(SOCK_STREAM):实现面向连接的TCP通信
    • 数据报套接字(SOCK_DGRAM):实现无连接的UDP通信
    • 原始套接字:实现IP数据报通信
  • 基于TCP和UDP的应用程序中,可以使用TcpListener类、TcpClient类、UdpClient类或Socket类实现。而编写自定义的新网络协议程序时,则只能用Socket类来实现。

2. TCP应用编程(TCPClient类、TcpListener类)

  • IP连接领域有两种通信类型:面向连接的(Connection-Oriented)和无连接的(Connectionless)
  • 在面向连接的套接字中,使用TCP来建立两个IP地址端点之间的会话。一旦建立了这种连接,就可以在设备之间进行可靠的数据传输。
  • TCP应用编程具体实现上:服务端使用TcpListener类,客户端使用TcpClient类;或者全部使用Socket实现。

3. UDP应用编程

  • UDP使用无连接的套接字,无连接的套接字不需要在网络设备之间发送连接信息。因此,在程序中很难确定有哪些服务器和客户端。
  • 具体实现:UdpClient类是在UDP层面对套接字编程的进一步封装。

1.4 IP地址转换与域名解析(IP地址转换与域名解析在System.Net命名空间下进行)

1.IP地址与端口

  • 在网络上,识别远程主机的信息主要由:
    • 主机标识(IP)号:确定主机
    • 端口号:确定进程

注意私有IP和公有IP的区别私有IP是一个封闭网络中对内部的主机进行分配的 , 公有ip是在全网范围内不同的主机所分配的标识

  • IP地址:
    • 子网掩码:用于屏蔽IP地址的一部分以区分网络标识和主机标识

    • 子网掩码把所有的网络位用1来表示,主机位用0来标识
      - eg: 如果将子网掩码设置为255.255.255.0,则对于IP地址192.168.1.X,其网络标示部分为192.168.1;主机标示为:X

    • 目前IP地址主要有两种编址方案:

      • IPV4编址方案:用点分十进制法共分为五类

        • A类:0.x.x.x~127.x.x.x (32位最高位为0)

        • B类:128.x.x.x~191.x.x.x (32位最高2位为10)

        • C类:192.x.x.x~223.x.x.x (32位最高3位为110)

        • D类:224.x.x.x~239.x.x.x(32位最高4位为1110)

        • E类:240.x.x.x~255.x.x.x(32位最高5位为11110)

          A类:网络位·主机位·主机位·主机位 可容纳1600万台机器 A类中有一个特殊IP地址127.0.0.1用于本机的回路测试

          B类:网络位·网络位·主机位·主机位 65535台机器

          C类:网络位·网络位·网络位·主机位 255台机器

          D类用于组播,E类用于科学研究。 TCP/IP协议规定用1110开始的地址都为多点广播地址

  • 端口:
    • 物理意义上的端口
    • 逻辑意义上帝的端口,即进程标识,端口号的范围从0到65535 HTTP的端口号为80 FTP为21
    • 网络编程中的端口为逻辑意义上的端口
    • 1000以内的端口号大多被标准协议所占用;应用程序中可以自由使用的端口号一般都使用大于1000的值。

2. IP地址转换成相关类

需要掌控的几个基本类

  • IPAddress类 提供网际协议IP地址:

    • IPAdress位于System.Net命名空间下,提供对IP地址的转换和处理功能。

    • 常用方法:Parse类将IP地址字符串类型转化为IPAddress类型:

      • Try
        {
            IPAddress ip = IPAddress.Parse("143.24.20.36");
        }
        Catch
        {
            MessageBox.Show("请输入正确的IP地址!");
        }
        
    • 如果IP地址字符串格式不正确,调用Parse方法时会出现异常。

    • 利用实例的AddressFamily属性可以判断IP地址的类型

      `IPAddress ip = IPAddress.Parse("::1");
      if (ip.AddressFamily == AddressFamily.InterNetworkV6)
      {
          MessageBox.Show("这是IPv6地址");
      }`
      
    • IPAdress类还提供了7个只读字段,分别代表程序中使用的特殊IP

  • 包含IP地址和端口号的IPEndAddress类:

    • IPEndPoint描述应用程序连接到主机上的服务所需的主机和端口信息

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

      • eg:

        IPAddress localAddress = IPAddress.Parse("192.168.1.1");
        IPEndPoint iep = new IPEndPoint(localAddress, 65000);
        string s1 = "IP地址为:" + iep.Address;
        string s2 = "IP端口为:" + iep.Port;
        
  • 为Internet或Intranet主机体统信息容器的IPHostEntry类:

    • IPHostEntry类将一个域名系统(DNS)的主机名与一组别名和一组匹配的IP地址关联。该类和一般Dns类一起使用。

      DNS(域名系统)是用来将域名和IP地址进行映射转换的分布式数据库

  • 常用属性:

    • AddressList属性:获取或设置与主机关联的IP地址列表(包括IPv4和IPv6)
    • HostName属性:包含了指定主机的主机名
    • Dns类的静态方法GetHostEntry()能够获得IPHostEntry对象:
      • eg : IPAddress[] ips = Dns.GetHostEntry(“news.sohu.com”).AddressList;

3. 域名解析

  • Donmain Name system(域名系统)DNS

  • Dns类常用方法:

方法名称说明
GetHosstAddressess返回指定主机的Internet协议IP地址,与该方法对应的还有异步方法
GetHostEntry将主机名或IP地址解析为IPHostEntry实例,与该方法对应的还有异步方法
GetHostName获取本地计算机的主机名
  • GetHostAddresses方法:

    • 利用GetHostAddresses方法可以获取指定主机的IP地址,该方法返回一个IPAddress类型的数据

      • 方法原型为 public static IPAddress[] GetHostAddress(string hostNameOr Address)

        参数是要解析的主机名或IP地址

      • eg: IPAddress[] ip = Dns.HostAddress(“www.cctv.com”)

      • 若hostNameOrAddress是IP地址,则直接返回此地址;若hostNameOrAddress是空字符串,则返回本机所有IPv4和IPv6地址。

  • GetHostEntry方法:

    • GetHostEntry方法可返回一个IPHostEntry实例,用于在DNS服务器中查询与某个主机名或IP地址关联的IP地址列表。

      • 方法原型为:public static IPHostEntry GetHostEntry (string hostNameOrAddress)

        参数中的hostNameOrAddress表示要解析的主机名或IP地址

    • 当参数为空字符串时,返回本地主机的IPHostEntry实例。

      • eg:
        IPHostEntry host = Dns.GetHostEntry("");
        var ipAddresses = host.AddressList; //获取本机所有IP地址
        string name = host.HostName; //获取本机主机名
  • GetHostName方法

    • 该方法用于获取本机主机名

      • eg:

        string hostname = Dns.GetHostName( );

1.5网卡信息检测和网络流量检测

1. 网卡信息检测相关类

  • **网络适配器:**又称网卡或网络接口卡(NIC),是连接计算机与网络的硬件设备。整理计算机上发往网线上的数据,并将数据分解为适当大小的数据包之后向网络上发送。

  • System.Net.NetworkInformation命名空间提供了:

    • 对本机网卡相关信息的检测比如本机有多少网卡,网卡名称、速度、硬件地址等。
    • 对本机网络流量的检测比如网络连接配置、接收与发送的数据包等。
  • ​ NetworkInterface类:

    • NetworkInterface类提供了网络适配器的配置和统计信息。可以利用这个类检测本机有多少个网络适配器、网络适配器型号以及网络适配器的速度等。

    • 本机的每一个网络适配器都包含一个NetworkInter对象与之相对应

    • 可以通过静态方法获取网络适配器对象

      • NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterface();
    • NetworkInterface常用的属性:

      属性及方法说明
      Name属性网络适配器名称
      Speed属性网络适配器速度
      GetAllNetwordInterfaces方法返回描述本地计算机上的所有网络适配器对象
      GetIPProperties方法返回描述此适配器配置的对象
      GetIsNetworkAvailable方法指示是否有任何可用的网络连接
      GetPhysicalAddress方法返回此适配器的媒体访问控制(MAC)地址
      Supports方法指示接口是否支持指定的协议(IPv4或IPv6)
  • IPInterfaceProperties类

    • 可以利用这个类检测本机所有网络适配器支持的各种地址。检测本机所有网络适配器支持的各种地址(IPv4和IPv6的网络适配器地址信息),如Dns服务器的IP地址、网关地址以及多路广播地址。

    • IPInterfaceProperties类是抽象类,不能实例化。可以通过NetworkInterface对象的GetIPProperties()获得其实例

      • eg: NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
        IPInterfaceProperties adapterProperties = adapters[0].GetIPProperties();
    • IPInterfaceProperties类常用的方法:

      • 属性及方法说 明
        AnycastAddresses属性获取分配给此接口的任意广播P地址
        DhcpServerAddresses属性获取此接口的动态主机配置协议(DHCP)服务器的地址
        DnsAddresses属性获取此接口的域名系统(DNS)服务器的地址
        DnsSuffix属性获取与此接口关联的域名系统(DNS)后缀
        GatewayAddresses属性获取此接口的网关地址
        MulticastAddresses属性获取分配给此接口的多路广播地址
        UnicastAddresses属性获取分配给此接口的单播地址
        GetIPv4Properties方法获取此网络接口的Internet协议版本4(IPv4)配置数据
        GetIPv6Properties方法获取此网络接口的Internet协议版本6(IPv6)配置数据

2.网络流量检测相关类:

  • IPGlobalProperties:

    • 提供了本地计算机网络连接和统计数据的信息

      • eg: 接受的数据包个数、丢失的数据包个数等
    • 检测网络流量时,首先调用IPGlobalProperties类提供的静态方法GetIPGlobalProperties得到IPGlobalProperties的实例,然后通过该实例的相关属性即可得到需要的信息。

      • eg: IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties()

      • GetActiveTcpConnections返回有关本地计算机上的 Internet 协议版本 4 (IPV4) 传输控制协议 (TCP) 连接的信息
        GetActiveTcpListeners返回有关本地计算机上的 Internet 协议版本 4 (IPV4) 传输控制协议 (TCP) 侦听器的终结点信息
        GetActiveUdpListeners返回有关本地计算机上的 Internet 协议版本 4 (IPv4) 用户数据报协议 (UDP) 侦听器的信息
        GetIPv4GlobalStatistics提供本地计算机的 Internet 协议版本 4 (IPv4) 统计数据
        GetIPv6GlobalStatistics提供本地计算机的 Internet 协议版本 6 (IPv6) 统计数据
        GetTcpIPv4Statistics提供本地计算机的传输控制协议**/Internet** 协议版本 4 (TCP/IPv4) 统计数据
        GetTcpIPv6Statistics提供本地计算机的传输控制协议**/Internet** 协议版本 6 (TCP/IPv6) 统计数据
  • **TcpConectionInformation类:**提供本机传输控制协议(TCP)连接的信息

    • eg:

      	IPGlobalProperties properties = 
          IPGlobalProperties.GetIPGlobalProperties();
      TcpConnectionInformation[] connections = 
               properties.GetActiveTcpConnections();
      foreach (TcpConnectionInformation t in connections)
      {
       	 string str = "本机:" + t.LocalEndPoint.Address+
      	                    ",远程:" + t.RemoteEndPoint.Address+
                    	 ", 状态:" + t.State;
      	 listBox1.Items.Add(str);
      }
      
  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值