1、利用MFC进行网络编程Network Programming with MFC Prof.Xiao-jie Yuan内容提要网络基础知识MFC网络编程Windows套接字CAsyncSocket类TCP协议编程聊天室客户端聊天室服务器端程序功能演示网络基础知识/网络基础知识:对TCP/IP协议进行简要介绍网络基础知识TCP/IP协议Windows的网络通信建立在TCP/IP协议的基础上TCP/IP协议族包含一系列构成互联网基础结构的网络协议TCP/IP字面上代表两个重要协议TCP:传输控制协议IP:网际协议网络基础知识TCP/IP参考模型TCP/IP参考模型包括4层:主机至网络层(Host-t
2、o-network)互联层(Internet)传输层(Transport)应用层(Application)网络基础知识TCP/IP模型与OSI模型应用层表示层传输层网络层数据链路层物理层会话层应用层传输层互联层主机至网络层OSITCP/IP网络基础知识几个典型的协议IP协议(互联层)是一个路由协议,负责IP寻址、数据包的分片和重组等任务TCP协议(传输层)提供一对一有连接的通信服务 提供连接的确认,数据包发送/接收顺序的控制,出错重传等机制 保证数据在传输中的正确性HTTP协议(应用层)用于传送Web网页文件网络基础知识数据包的封装应用层传输层互联层主机至网络层TCP/IP模型应用程序HTTP
3、协议TCP协议IP协议网卡驱动以太网首部 IP首部 TCP首部 HTTP首部 用户数据 以太网尾部IP首部 TCP首部 HTTP首部 用户数据TCP首部 HTTP首部 用户数据HTTP首部 用户数据用户数据使用协议封装的数据包MFC网络编程/MFC网络编程:Windows套接字Windows套接字什么是套接字套接字是一种网络编程接口 英文:socket 字面意思:插座、插口可以形象地将套接字理解为应用程序与网络协议之间的插口,也就是编程接口套接字在TCP/IP模型中位于传输层之上 主要针对TCP、UDP协议进行抽象 不涉及应用层协议Windows套接字套接字在TCP/IP模型中的位置主机至网络
4、层以太网令牌环帧中继ATM.互联层IPARPICMPIGMP传输层TCPUDP应用层套接字 SocketsWindows套接字套接字是网络通信的端点在网络中,主机H1上的一个套接字端点(endpoint)可以和主机H2上的另一个套接字端点进行通信IP地址和端口号可以唯一确定一个套接字Windows套接字Windows套接字套接字的概念最初是由BSD Unix操作系统所实现的Microsoft将Unix套接字中的大部分函数移植到Windows操作系统,形成了Windows套接字Windows套接字针对Windows操作系统的消息驱动机制,对原有的Unix套接字进行了扩展,定义了一部分新的函数Wi
5、ndows套接字在MFC中使用Windows套接字使用MFC提供的Windows套接字功能 可以利用面向对象的概念进行网络编程 比直接调用Win32 API更方便、更直观MFC中与套接字功能有关的类包括:CAsyncSocket类:对套接字API进行了较低级别的封装 CSocket类:对套接字API进行了较高级别的封装 CSocket类是CAsyncSocket类的派生类Windows套接字套接字类的层次CObjectCAsyncSocketCSocket/MFC网络编程:CAsyncSocket类CAsyncSocket类CAsyncSocket类虽然对Windows Sockets API
6、的封装级别较低但该类为网络通信程序的开发提供了很大的灵活性可以对一些有关网络协议的具体选项参数进行设定CAsyncSocket类CAsyncSocket类CAsyncSocket类只将套接字的通知消息改进为C+语言中的可重载的消息处理函数没有像CSocket那样引入文件、文档、串行化等其他额外的概念,这使编程变得更加简洁方便CAsyncSocket类创建CAsyncSocket类对象CAsyncSocket类对象代表网络通信端点采用两步构造法:1、定义CAsyncSocket类对象变量CAsyncSocket sock;2、调用Create成员函数进一步创建该对象sock.Create();C
7、AsyncSocket类套接字的种类流套接字(stream socket)使用TCP协议进行通信 具有TCP协议所拥有的各种特征 面向连接的、可靠的数据流传输服务 数据包不会出现丢失、重复、乱序等现象数据报套接字(datagram socket)使用UDP协议进行通信 具有UDP协议所拥有的各种特征 面向非连接的、不可靠的用户数据报传输服务 数据包可能出现丢失、重复、乱序等现象CAsyncSocket类指定套接字的种类Create成员函数缺省创建的是流套接字SOCK_STREAM也可以根据需要指明创建数据报套接字SOCK_DGRAM流套接字和数据报套接字在收发数据时所调用的函数有所不同 流套接
8、字调用成员函数 Send 和 Receive 数据报套接字调用成员函数 SendTo 和 ReceiveFromCAsyncSocket类套接字的工作模式套接字在使用时分为两种模式阻塞式非阻塞式阻塞模式也称为同步模式非阻塞模式也称为异步模式CAsyncSocket类阻塞模式在阻塞模式下,套接字函数要一直等到全部操作完成后才返回例如,在建立连接时函数必须等到连接完全建立好为止调用函数的线程在这期间被挂起程序看起来好像停止了响应CAsyncSocket类阻塞模式的缺点以阻塞模式执行套接字函数,可能会出现某个函数的执行等待很长时间的情况必须考虑建立多个线程来执行每个套接字函数,程序编写起来比较繁琐C
9、AsyncSocket类非阻塞模式BSD Unix是命令行方式的系统套接字适合以阻塞模式工作Windows是消息驱动的系统套接字适合以非阻塞模式工作Windows为所有的套接字函数提供了非阻塞模式的版本CAsyncSocket类非阻塞模式在非阻塞模式下一个套接字函数被调用后会立即返回即使它执行的操作还没有全部完成当函数最终完成所执行的操作时Windows通过发送消息的方式通知程序该模式适合Windows的消息驱动体系CAsyncSocket类非阻塞模式Windows套接字接口建议程序员使用非阻塞模式进行网络通信编程一个CAsyncSocket类对象默认地工作在非阻塞模式(即异步模式)下这就是C
10、AsyncSocket(Asyncronization Socket)这个类名称的来源CAsyncSocket类绑定IP地址和端口号 1.调用Create函数时还可以指定,套接字对象所要绑定的主机IP地址端口号2.Create函数根据这个IP地址和端口号去调用Bind函数以实现套接字的绑定CAsyncSocket类通信前的准备工作1.客户端调用Connect函数以连接到服务器2.服务器端调用Listen函数监听客户的进入3.服务器端调用Accept函数与客户建立连接客户端服务器端1Connect2Listen3AcceptCAsyncSocket类收发数据发送数据接收数据流套接字SendRec
11、eive数据报套接字SendToReceiveFromCAsyncSocket类处理通知消息 CAsyncSocket类对底层Windows 套接字API的改进调用AsyncSelect函数指定程序要处理的套接字通知消息 实现非阻塞模式套接字的关键在于处理通知消息CAsyncSocket类处理通知消息 用于处理通知消息的虚函数 OnAccept:当一个连接请求到来时 OnConnet:当一个连接尝试完成时 OnClose:当另一端套接字关闭时 OnReceive:当准备好接收数据时 OnSend:当准备好发送数据时CAsyncSocket类套接字句柄 CAsyncSocket类有一个成员变量m
12、_hSocket 它代表CAsyncSocket类对象所依附的Windows套接字句柄CAsyncSocket类错误处理大多数套接字函数都可能调用失败当某个套接字函数调用失败时返回错误码SOCKET_ERROR紧跟着调用函数GetLastError进一步获得出错原因码通过查表可得到出错原因的描述针对各种异常情况进行不同处理CAsyncSocket类CAsyncSocket类成员列表 成员函数描述 用于构造 CAsyncSocket 构造函数 Create 创建一个套接字 CAsyncSocket类成员列表 成员函数 描述 属性 Attach 将一个套接字句柄附属于CAsyncSocket对象
13、Detach 从CAsyncSocket对象中分离套接字句柄 FromHandle 给定一个套接字句柄,返回一个指向 CAsyncSocket对象的指针 GetLastError 得到最后一个失败操作的错误情况 GetPeerName 得到与套接字连接的对等套接字的地址 GetSockName 得到套接字的本地名称 GetSockOpt 获取套接字的选项 SetSockOpt 设置套接字的选项 CAsyncSocket类成员列表 成员函数 描述 操作 Accept 接受套接字上的一个连接 AsynSelect 设置套接字的通知事件 Bind 将一个本地地址绑定到套接字上 Close 关闭套接字
14、 Connect 与对等套接字建立连接 IOCtl 控制套接字的方式 Listen 监听进入的连接请求 Receive 从套接字接收数据 ReceiveFrom 接收一个数据报并且存储源端地址 Send 向一个连接的套接字发送数据 SendTo 向一个指定的地址发送数据 ShutDown 禁止在套接字上调用函数Send和ReceiveCAsyncSocket类成员列表 成员函数 描述 通知消息处理 OnAccept 通知一个监听套接字,它可以通过调用Accept 函数来接收等待中的连接请求 OnClose 通知套接字与它连接的另一个套接字已经关闭 OnConnect 通知一个连接中的套接字,连
15、接的尝试已经完 成,是否成功可以通过错误码进一步判断 OnOutOfBandData 通知一个正在接收数据的套接字,有“带外数据”要被读入,这通常是一个紧急的报文 OnReceive 通知套接字可以通过调用Receive函数来获取 数据 OnSend 通知套接字可以通过调用Send函数来发送数据 成员变量 m_hSocket 代表附属于CAsyncSocket对象的SOCKET句柄TCP协议编程客户机/服务器模型客户机是在本地计算机上运行的向服务器请求服务的程序客户机程序是有限的由用户启动,当所需服务完成时就终止客户机程序是通信的主动发起方使用远端计算机的IP地址与在该计算机上运行的特定服务器
16、程序的特定端口号建立通信连接客户机/服务器模型服务器是在远端计算机上运行的向客户提供服务的程序当服务器启动时,将“门”打开使得从客户发出的连接请求可以进来服务器程序是无限的当它启动以后就不停的运行下去,除非出了故障服务器是通信的被动等待方客户机/服务器模型绑定本地IP地址和服务端口(Create Bind)监听进入的连接(Listen)接收连接(Accept)收发数据(Send/Receive)创建套接字(Create)服务器端关闭套接字(Close)向服务器发起连接(Connect)创建套接字(Create)客户端关闭套接字(Close)收发数据(Send/Receive)简单的聊天室程序演示如何利用MFC的CAsyncSocket类进行网络通信编程编写一个简单的聊天室程序使用流套接字进行网络通信是基于TCP协议的包括客户端和服务器端两个部分验证了客户机/服务器模型 聊天室客户端聊天室服务器端总结