网络编程基本概念:基本概念(续2):网络编程基本概念:常用网络通信协议TCP/IP协议TCP(TransmissionControlProtocol传输控制协议)IP(InternetProtocol网际协议)HTTP协议HypertextTransterProtocol超文本传输协议FTP协议SMTP协议SimpleMailTransferProtocol简单邮件传输协议POP3/IMAP协议POP3(PostOfficeProtocol—Version3,邮局协议)IMAP(InternetMessageAccessProtocol,Internet消息访问协议)常用的网络协议网络编程•域名(DomainAddress)与IP地址间存在映射关系,由网络中的域名服务器DNS:DomainNameServer)负责解析。•端口(Port)逻辑上的数据传输通道、或模拟通道。基本概念(续3):C#网络编程(DNS类的常用方法,P10)System.Net命名空间包含一些可以给低级和简单的编程接口类.其中常用的类如下:(P9—表1-2)1、DNS类向使用TCP/IPInternet服务的应用程序提供域名服务该类常见方法:(1)Resolve()方法:查询DNS服务器以将用户友好的域名(如“”)映射到数字形式的Internet地址(如192.168.1.1)。Resolve()方法返回一个IPHostEntry实例,该实例包含所请求名称的地址和别名的列表。大多数情况下,可以使用AddressList数组中返回的第一个地址。IPHostEntryipHostInfo=Dns.Resolve();IPAddressipAddress=ipHostInfo.AddressList[0];C#网络编程(DNS类的常用方法,P10)(2)GetHostname()方法GetHostByAddress()方法GetHostByName()方法Stringhostname=Dns.GetHostname();IPHostEntryhostInfo=Dns.GetHostByAddress(“192.168.1.1”);IPHostEntryhostInfo=Dns.GetHostByName();在使用以上方法时,你将可能需要处理以下几种异常:SocketException异常:访问Socket时操作系统发生错误引发ArgumentNullException异常:参数为空引用引发ObjectDisposedException异常:Socket已经关闭引发C#网络编程(IPHostEntry类的常用方法,P10)2、IPHostEntry类(P9—表1-2)为Internet主机地址信息提供容器类。该类的实例对象中包含了Internet主机的地址相关信息。主要的一些属性有:AddressList属性、Aliases属性以及HostName属性。AddressList属性:获取或设置与主机关联的IP地址列表。该属性值是一个IPAddress类型的数组;Aliases属性:获取或设置与主机关联的别名列表。该属性中是一组字符串。C#网络编程(IPHostEntry类的常用方法,P10)2、IPHostEntry类续(P9—表1-2)AddressList属性:获取或设置与主机关联的IP地址列表。该属性值是一个IPAddress类型的数组;Aliases属性:获取或设置与主机关联的别名列表。该属性中是一组字符串。IPHostEntryIPHost=Dns.Resolve();string[]aliases=IPHost.Aliases;Console.WriteLine(aliases.Length);IPAddress[]addr=IPHost.AddressList;Console.WriteLine(addr.Length);for(inti=0;iaddr.Length;i++){Console.WriteLine(addr[i]);}3、IPEndPoint类网络地址标识网络上的特定设备;端口号标识要连接到的该设备上的特定服务。网络地址和服务端口的组合称为终结点。IPEndPoint类包含应用程序连接到主机上的服务所需的主机和端口。该类中的属性有:Address属性、AddressFamily属性以及Port属性。C#网络编程(IPEndPoint类的常用方法,P10)IPHostEntryIPHost=Dns.Resolve(“”);IPAddressaddr=IPHost.AddressList[0];IPEndPointep=newIPEndPoint(addr,8000);4、IPAddress类提供对IP地址的转换、处理等功能IPAdress.Parse()方法---将IP地址字符窜转换为IPAddress实际实例。例:IPAddressip=IPAddress.Parse(“192.168.1.1”);C#网络编程(IPEndPoint类的常用方法,P10)IPAdress类提供了7个只读字段:Any:本地系统可用的任何IP地址Broadcast:本地网络的IP广播地址Loopback:系统的回送地址None:系统上没有可用的网络接口IPv6Any:IPv6NoneIPv6LoopbackC#网络编程例:获取本地计算机的主机名//Dns.GetHostName()获取指定DNS主机名的DNS信息//Dns.GetHostByName()//得到本地主机的DNS信息IPHostEntrymyHost=newIPHostEntry();try{mhhost=Dns.GetHostName();console.writeline(myHost.HostName.ToString());myHost=Dns.GetHostEntry(Dns.GetHostName());//显示本地主机的IP地址表for(inti=0;imyHost.AddressList.Length;i++){console.writeline(本地主机IP地址-+myHost.AddressList[i].ToString()+\r);}}catch(Exceptionerror){MessageBox.Show(error.Message);}C#网络编程例:对一组IP地址(同一网段的)查看其主机是否在线。原理是:若该主机在线,则通过IP访问该主机,将可以解析出其主机名。stringstrScanIPAdd=“192.168.10.1”try{IPHostEntrymyScanHost=Dns.Resolve(strScanIPAdd);stringstrHostName=myScanHost.HostName.ToString();}catch(Exceptionerror){MessageBox.Show(error.Message);}客户机/服务器模式(P6)客户机/服务器(client/server)模式客户向服务器发出请求,服务器接收后,提供相应的服务。服务器需有处理多个客户进程请求的能力,即并发处理能力。因此,服务器根据请求采用“并发服务器”或“重复服务器”。若为“并发服务请求”,则,要激活一新进程处理客户请求。套接字(socket)引入•为了方便开发网络应用程序。由美国伯克利大学在UNIX上推出了一种程序访问通信协议的操作系统调用socket。Socket的出现,使程序员可以方便地访问TCP/IP。•随着UNIX的应用推广,socket又被引进到windows等操作系统中。Java语言、C++语言、C#语言等也引入了socket编程思想。即:两个进程间通过一个双向的网络通信连接实现数据交换,这种通信链路的端点被称为“套接字”套接字及其类型(P5)1、流式套接字(sock_stream)使用TCP协议,在传输前必须先建立一条通信连接。不支持广播和多播方式。2、数据报套接字(sock_dgram)使用UDP协议进行传输。支持广播和多播方式。3、原始套接字(sock_raw)可读写内核没有处理的IP数据报,以便对较低层协议,如IP、ICMP协议直接访问。套接字Socket的建立(参见P18)1、流式套接字(sock_stream)Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);2、数据报套接字(sock_dgram)Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);3、原始套接字(sock_raw)网络进程通信的标识(P6)•网络进程需要采用三级寻址:特定网络协议、主机地址、进程标识半相关-----准确标识本地通信进程全相关-----准确标识了网间通信进程Socket类---常用属性属性说明AddressFamily获取Socket的地址族ProtocolType获取Socket的协议类型SocketType获取Socket的类型RemoteEndPoint获取远程终结点Connected获取一个值,该值指示Socket是否已连接到远程资源Blocking获取或设置一个值,该值指示Socket是否处于阻塞模式Handle获取Socket的操作系统句柄Available获取已经从网络接收且可供读取的数据量LocalEndPoint获取本地终结点方法说明Accept创建新的Socket以处理传入的连接请求。Bind使Socket与一个本地终结点相关联。Connect建立到远程设备的连接。Listen将Socket置于侦听状态。Receive接收来自连接Socket的数据。BeginConnect开始对网络设备连接的异步请求。BeginAccept开始一个异步请求,以创建新的Socket来接受传入的连接请求。BeginSendTo向特定远程主机异步发送数据。BeginReceive开始从连接的Socket中异步接收数据。BeginReceiveFrom开始从指定网络设备中异步接收数据Socket类---常用方法1方法说明BeginSend将数据异步发送到连接的BeginSendTo向特定远程主机异步发送数据。Close强制Socket连接关闭EndAccept结束异步请求以创建新的Socket来接受传入的连接请求EndConnect结束挂起的异步连接请求EndReceive结束挂起的异步读取EndReceiveFrom结束挂起的、从特定终结点进行异步读取。EndSend结束挂起的异步发送EndSendTo结束挂起的、向指定位置进行的异步发送。Socket类---常用方法2方法说明Close强制Socket连接关闭GetSocketOption返回Socket选项的值ReceiveFrom接收数据文报并存储源终结点Select确定一个或多个套接字的状态IOControl为Socket设置低级别操作模式Shutdown禁用某Socket上的发送和接收Socket类---常用方法3套接字Socket的使用(参见P19)服务器端:Socketnewsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);newsocket.Bind(newIPEndPoint(IPAddress.Parse(_localIP),2000));//将该套接字绑定到本地的IPEndAddress,端口上newsocket.Listen(50);Socketclient=newsocket.A