您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 绩效管理 > MFC网络程序设计.
第八讲MFC网络程序设计主讲:吕骏计算机网络计算机网络是相互连接的独立自主的计算机的集合,最简单的网络形式由两台计算机组成。两台计算机通过网络进行通信AB网络192.168.0.118192.168.0.10协议协议端口号端口号IP地址IP网络中每台主机都必须有一个惟一的IP地址;IP地址是一个逻辑地址;因特网上的IP地址具有全球唯一性;32位,4个字节,常用点分十进制的格式表示,例如:192.168.0.16协议为进行网络中的数据交换(通信)而建立的规则、标准或约定。(=语义+语法+规则)不同层具有各自不同的协议。网络的状况多种通信媒介——有线、无线……不同种类的设备——通用、专用……不同的操作系统——Unix、Windows……不同的应用环境——固定、移动……它们互相交织,形成了非常复杂的系统应用环境。ISO/OSI七层参考模型OSI(OpenSystemInterconnection)参考模型将网络的不同功能划分为7层。应用层表示层物理层会话层传输层网络层数据链路层处理网络应用数据表示主机间通信端到端的连接寻址和最短路径介质访问(接入)二进制传输OSI各层所使用的协议应用层:远程登录协议Telnet、文件传输协议FTP、超文本传输协议HTTP、域名服务DNS、简单邮件传输协议SMTP、邮局协议POP3等。传输层:传输控制协议TCP、用户数据报协议UDP。TCP:面向连接的可靠的传输协议。UDP:是无连接的,不可靠的传输协议。网络层:网际协议IP、Internet互联网控制报文协议ICMP、Internet组管理协议IGMP。TCP/IP模型TCP/IP起源于美国国防部高级研究规划署(DARPA)的一项研究计划——实现若干台主机的相互通信。现在TCP/IP已成为Internet上通信的工业标准。TCP/IP协议Windows的网络通信建立在TCP/IP协议的基础上TCP/IP协议族包含一系列构成互联网基础结构的网络协议TCP/IP字面上代表两个重要协议TCP:传输控制协议IP:网际协议网络基础知识TCP/IP参考模型TCP/IP参考模型包括4层:主机至网络层(Host-to-network)互联层(Internet)传输层(Transport)应用层(Application)几个典型的协议IP协议(互联层)是一个路由协议,负责IP寻址、数据包的分片和重组等任务TCP协议(传输层)提供一对一有连接的通信服务提供连接的确认,数据包发送/接收顺序的控制,出错重传等机制保证数据在传输中的正确性HTTP协议(应用层)用于传送Web网页文件TCP/IP与OSI参考模型的对应关系应用层表示层会话层传输层物理层数据链路层网络层7654321OSI参考模型应用层传输层网络接口网络层TCP/IP模型端口按照OSI七层模型的描述,传输层提供进程(应用程序)通信的能力。为了标识通信实体中进行通信的进程(应用程序),TCP/IP协议提出了协议端口(protocolport,简称端口)的概念。端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都通过该端口输出。端口用一个整数型标识符来表示,即端口号。端口号跟协议相关,TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立。端口使用一个16位的数字来表示,它的范围是0~65535,1024以下的端口号保留给预定义的服务。例如:http使用80端口。客户机/服务器模式在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模式(client/server),即客户向服务器提出请求,服务器接收到请求后,提供相应的服务。客户机/服务器模式客户机/服务器模式在操作过程中采取的是主动请求的方式。首先服务器方要先启动,并根据请求提供相应的服务:①打开一个通信通道并告知本地主机,它愿意在某一地址和端口上接收客户请求。②等待客户请求到达该端口。③接收到服务请求,处理该请求并发送应答信号,同时要激活一个新的进程(或线程)来处理这个客户请求。新进程(或线程)处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。④返回第二步,等待另一客户请求。⑤关闭服务器。客户方:①打开一个通信通道,并连接到服务器所在主机的特定端口。②向服务器发服务请求报文,等待并接收应答;继续提出请求。③请求结束后关闭通信通道并终止。WindowsSockets通信机制WindowsSockets通信的基础是套接字(Socket)什么是套接字套接字是一种网络编程接口英文:socket字面意思:插座、插口可以形象地将套接字理解为应用程序与网络协议之间的插口,也就是编程接口套接字在TCP/IP模型中位于传输层之上主要针对TCP、UDP协议进行抽象不涉及应用层协议Windows套接字套接字是网络通信的端点在网络中,主机H1上的一个套接字端点(endpoint)可以和主机H2上的另一个套接字端点进行通信IP地址和端口号可以唯一确定一个套接字Windows套接字套接字的概念最初是由BSDUnix操作系统所实现的Microsoft将Unix套接字中的大部分函数移植到Windows操作系统,形成了Windows套接字Windows套接字针对Windows操作系统的消息驱动机制,对原有的Unix套接字进行了扩展,定义了一部分新的函数Windows套接字MFC中使用Windows套接字使用MFC提供的Windows套接字功能可以利用面向对象的概念进行网络编程比直接调用Win32API更方便、更直观MFC中与套接字功能有关的类包括:CAsyncSocket类:对套接字API进行了较低级别的封装CSocket类:对套接字API进行了较高级别的封装CSocket类是CAsyncSocket类的派生类套接字类的层次CObjectCAsyncSocketCSocketCAsyncSocket类CAsyncSocket类虽然对WindowsSocketsAPI的封装级别较低但该类为网络通信程序的开发提供了很大的灵活性可以对一些有关网络协议的具体选项参数进行设定CAsyncSocket类CAsyncSocket类CAsyncSocket类只将套接字的通知消息改进为C++语言中的可重载的消息处理函数没有像CSocket那样引入文件、文档、串行化等其他额外的概念,这使编程变得更加简洁方便套接字的种类流套接字(streamsocket)使用TCP协议进行通信具有TCP协议所拥有的各种特征面向连接的、可靠的数据流传输服务数据包不会出现丢失、重复、乱序等现象数据报套接字(datagramsocket)使用UDP协议进行通信具有UDP协议所拥有的各种特征面向非连接的、不可靠的用户数据报传输服务数据包可能出现丢失、重复、乱序等现象指定套接字的种类Create成员函数缺省创建的是流套接字SOCK_STREAM也可以根据需要指明创建数据报套接字SOCK_DGRAM流套接字和数据报套接字在收发数据时所调用的函数有所不同流套接字调用成员函数Send和Receive数据报套接字调用成员函数SendTo和ReceiveFrom套接字的工作模式套接字在使用时分为两种模式阻塞式非阻塞式阻塞模式也称为同步模式非阻塞模式也称为异步模式CAsyncSocket类阻塞模式在阻塞模式下,套接字函数要一直等到全部操作完成后才返回例如,在建立连接时函数必须等到连接完全建立好为止调用函数的线程在这期间被挂起程序看起来好像停止了响应CAsyncSocket类阻塞模式的缺点以阻塞模式执行套接字函数,可能会出现某个函数的执行等待很长时间的情况必须考虑建立多个线程来执行每个套接字函数,程序编写起来比较繁琐CAsyncSocket类非阻塞模式BSDUnix是命令行方式的系统套接字适合以阻塞模式工作Windows是消息驱动的系统套接字适合以非阻塞模式工作Windows为所有的套接字函数提供了非阻塞模式的版本非阻塞模式在非阻塞模式下一个套接字函数被调用后会立即返回即使它执行的操作还没有全部完成当函数最终完成所执行的操作时Windows通过发送消息的方式通知程序该模式适合Windows的消息驱动体系非阻塞模式Windows套接字接口建议程序员使用非阻塞模式进行网络通信编程一个CAsyncSocket类对象默认地工作在非阻塞模式(即异步模式)下这就是CAsyncSocket(AsyncronizationSocket)这个类名称的来源使用CAsyncSocket类的一般步骤服务器客户1//创建一个套接字CAsyncSocketsockSrv;//创建一个套接字CAsyncSocketsockClient;2//创建底层套接字,获取其句柄,绑定到指定端口sockSrv.Create(nPort);//创建底层套接字,获取其句柄,使用默认参数sockClient.Create();3//启动监听,时刻准备接收连接请求sockSrv.Listen();4//请求连接到服务器sockClient.Connect(strAddr,nPort);5//构造一个新的空套接口CAsyncSocketsockRecv//接收连接sockSrv.Accept(sockRecv);6//接收数据,发送数据sockRecv.Receive(Buff,nLen);sockRecv.Send(Buff,nLen);//发送数据,接收数据sockClient.Send(Buff,nLen);sockClient.Receive(Buff,nLen);8//关闭套接口对象sockRecv.Close();//关闭套接口对象sockClientt.Close();一、创建CAsyncSocket类对象(1)1.创建空的异步套接字对象•CAsyncSocket类对象称为异步套接字对象。创建异步套接字对象分为两个步骤:–调用CAsyncSocket的构造函数,构造一个CAsyncSocket对象。构造函数没有带参数,所以它只创建一个新的空套接口对象;–调用它的Create成员函数,再创建该对象的底层的套接字数据结构,并绑定它的地址。一、创建CAsyncSocket类对象(2)•有两种使用方法:•(1)如:CAsyncSocketaa;•aa.Create(…);–这种方式,直接定义了CAsyncSocket类的变量。编译时,会隐式地调用该类的构造函数。在堆栈上创建该类对象实例。–使用对象实例变量调用该类的成员变量或成员函数时,要用.操作符。•(2)如:CAsyncSocket*Pa;Pa=newCAsyncSocket;Pa-Create(…);–这种方式,先定义异步套接口类型的指针变量,再显式调用该类的构造函数。在堆上创建该类对象实例,并将指向该对象实例的指针返回给套接口指针变量。使用对象实例指针变量调用该类成员时,要用-操作符。一、创建CAsyncSocket类对象(3)2.创建异步套接字对象的底层套接字句柄•通过调用CAsyncSocket类的Create()成员函数,创建该对象的底层套接字句柄,决定套接字对象的具体特性。•Create()函数的调用格式为:BOOLCreate(UINTnSocketPort=0,IntnSocketType=SOCK_STREAM,LongLevent=FD_READ|FD_WRITE|FD_OOBFD_ACCEPT|FD_CONNECT|FD_CLOSE,LPCTSTRlpszSocketAddress=NULL);–参数nSocketPort指定一个分配给套
本文标题:MFC网络程序设计.
链接地址:https://www.777doc.com/doc-2888508 .html