




已阅读5页,还剩53页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC进行网络编程NetworkProgrammingwithMFC,Prof.Xiao-jieYuan,内容提要,网络基础知识MFC网络编程Windows套接字CAsyncSocket类TCP协议编程聊天室客户端聊天室服务器端程序功能演示,网络基础知识,TCP/IP协议,Windows的网络通信建立在TCP/IP协议的基础上TCP/IP协议族包含一系列构成互联网基础结构的网络协议TCP/IP字面上代表两个重要协议TCP:传输控制协议IP:网际协议,网络基础知识,TCP/IP参考模型,TCP/IP参考模型包括4层:主机至网络层(Host-to-network)互联层(Internet)传输层(Transport)应用层(Application),网络基础知识,TCP/IP模型与OSI模型,应用层,表示层,传输层,网络层,数据链路层,物理层,会话层,应用层,传输层,互联层,主机至网络层,OSI,TCP/IP,网络基础知识,几个典型的协议,IP协议(互联层)是一个路由协议,负责IP寻址、数据包的分片和重组等任务TCP协议(传输层)提供一对一有连接的通信服务提供连接的确认,数据包发送/接收顺序的控制,出错重传等机制保证数据在传输中的正确性HTTP协议(应用层)用于传送Web网页文件,网络基础知识,数据包的封装,应用层,传输层,互联层,主机至网络层,TCP/IP模型,应用程序,HTTP协议,TCP协议,IP协议,网卡驱动,以太网首部,IP首部,TCP首部,HTTP首部,用户数据,以太网尾部,IP首部,TCP首部,HTTP首部,用户数据,TCP首部,HTTP首部,用户数据,HTTP首部,用户数据,用户数据,使用协议,封装的数据包,MFC网络编程,Windows套接字,什么是套接字,套接字是一种网络编程接口英文:socket字面意思:插座、插口可以形象地将套接字理解为应用程序与网络协议之间的插口,也就是编程接口套接字在TCP/IP模型中位于传输层之上主要针对TCP、UDP协议进行抽象不涉及应用层协议,Windows套接字,主机至网络层,互联层,IP,ARP,ICMP,IGMP,传输层,TCP,UDP,应用层,套接字Sockets,Windows套接字,套接字是网络通信的端点,在网络中,主机H1上的一个套接字端点(endpoint)可以和主机H2上的另一个套接字端点进行通信IP地址和端口号可以唯一确定一个套接字,Windows套接字,Windows套接字,套接字的概念最初是由BSDUnix操作系统所实现的Microsoft将Unix套接字中的大部分函数移植到Windows操作系统,形成了Windows套接字Windows套接字针对Windows操作系统的消息驱动机制,对原有的Unix套接字进行了扩展,定义了一部分新的函数,Windows套接字,在MFC中使用Windows套接字,使用MFC提供的Windows套接字功能可以利用面向对象的概念进行网络编程比直接调用Win32API更方便、更直观MFC中与套接字功能有关的类包括:CAsyncSocket类:对套接字API进行了较低级别的封装CSocket类:对套接字API进行了较高级别的封装CSocket类是CAsyncSocket类的派生类,Windows套接字,套接字类的层次,CObject,CAsyncSocket,CSocket,CAsyncSocket类,CAsyncSocket类,虽然对WindowsSocketsAPI的封装级别较低但该类为网络通信程序的开发提供了很大的灵活性可以对一些有关网络协议的具体选项参数进行设定,CAsyncSocket类,CAsyncSocket类,CAsyncSocket类只将套接字的通知消息改进为C+语言中的可重载的消息处理函数没有像CSocket那样引入文件、文档、串行化等其他额外的概念,这使编程变得更加简洁方便,CAsyncSocket类,创建CAsyncSocket类对象,CAsyncSocket类对象代表网络通信端点采用两步构造法:1、定义CAsyncSocket类对象变量CAsyncSocketsock;2、调用Create成员函数进一步创建该对象sock.Create();,CAsyncSocket类,套接字的种类,流套接字(streamsocket)使用TCP协议进行通信具有TCP协议所拥有的各种特征面向连接的、可靠的数据流传输服务数据包不会出现丢失、重复、乱序等现象数据报套接字(datagramsocket)使用UDP协议进行通信具有UDP协议所拥有的各种特征面向非连接的、不可靠的用户数据报传输服务数据包可能出现丢失、重复、乱序等现象,CAsyncSocket类,指定套接字的种类,Create成员函数缺省创建的是流套接字SOCK_STREAM也可以根据需要指明创建数据报套接字SOCK_DGRAM流套接字和数据报套接字在收发数据时所调用的函数有所不同流套接字调用成员函数Send和Receive数据报套接字调用成员函数SendTo和ReceiveFrom,CAsyncSocket类,套接字的工作模式,套接字在使用时分为两种模式阻塞式非阻塞式阻塞模式也称为同步模式非阻塞模式也称为异步模式,CAsyncSocket类,阻塞模式,在阻塞模式下,套接字函数要一直等到全部操作完成后才返回例如,在建立连接时函数必须等到连接完全建立好为止调用函数的线程在这期间被挂起程序看起来好像停止了响应,CAsyncSocket类,阻塞模式的缺点,以阻塞模式执行套接字函数,可能会出现某个函数的执行等待很长时间的情况必须考虑建立多个线程来执行每个套接字函数,程序编写起来比较繁琐,CAsyncSocket类,非阻塞模式,BSDUnix是命令行方式的系统套接字适合以阻塞模式工作Windows是消息驱动的系统套接字适合以非阻塞模式工作Windows为所有的套接字函数提供了非阻塞模式的版本,CAsyncSocket类,非阻塞模式,在非阻塞模式下一个套接字函数被调用后会立即返回即使它执行的操作还没有全部完成当函数最终完成所执行的操作时Windows通过发送消息的方式通知程序该模式适合Windows的消息驱动体系,CAsyncSocket类,非阻塞模式,Windows套接字接口建议程序员使用非阻塞模式进行网络通信编程一个CAsyncSocket类对象默认地工作在非阻塞模式(即异步模式)下这就是CAsyncSocket(AsyncronizationSocket)这个类名称的来源,CAsyncSocket类,绑定IP地址和端口号,调用Create函数时还可以指定,套接字对象所要绑定的主机IP地址端口号Create函数根据这个IP地址和端口号去调用Bind函数以实现套接字的绑定,CAsyncSocket类,通信前的准备工作,客户端调用Connect函数以连接到服务器服务器端调用Listen函数监听客户的进入服务器端调用Accept函数与客户建立连接,客户端,服务器端,CAsyncSocket类,收发数据,CAsyncSocket类,处理通知消息,CAsyncSocket类对底层Windows套接字API的改进调用AsyncSelect函数指定程序要处理的套接字通知消息实现非阻塞模式套接字的关键在于处理通知消息,CAsyncSocket类,处理通知消息,用于处理通知消息的虚函数OnAccept:当一个连接请求到来时OnConnet:当一个连接尝试完成时OnClose:当另一端套接字关闭时OnReceive:当准备好接收数据时OnSend:当准备好发送数据时,CAsyncSocket类,套接字句柄,CAsyncSocket类有一个成员变量m_hSocket它代表CAsyncSocket类对象所依附的Windows套接字句柄,CAsyncSocket类,错误处理,大多数套接字函数都可能调用失败当某个套接字函数调用失败时返回错误码SOCKET_ERROR紧跟着调用函数GetLastError进一步获得出错原因码通过查表可得到出错原因的描述针对各种异常情况进行不同处理,CAsyncSocket类,CAsyncSocket类成员列表,CAsyncSocket类成员列表,CAsyncSocket类成员列表,CAsyncSocket类成员列表,TCP协议编程,客户机/服务器模型,客户机是在本地计算机上运行的向服务器请求服务的程序客户机程序是有限的由用户启动,当所需服务完成时就终止客户机程序是通信的主动发起方使用远端计算机的IP地址与在该计算机上运行的特定服务器程序的特定端口号建立通信连接,客户机/服务器模型,服务器是在远端计算机上运行的向客户提供服务的程序当服务器启动时,将“门”打开使得从客户发出的连接请求可以进来服务器程序是无限的当它启动以后就不停的运行下去,除非出了故障服务器是通信的被动等待方,客户机/服务器模型,绑定本地IP地址和服务端口(CreateBind),监听进入的连接(Listen),接收连接(Accept),收发数据(Send/Receive),创建套接字(Create),服务器端,关闭套接字(Close),向服务器发起连接(Connect),创建套接字(Create),客户端,关闭套接字(Close),收发数据(Send/Receive),简单的聊天室程序,演示如何利用MFC的CAsyncSocket类进行网络通信编程编写一个简单的聊天室程序使用流套接字进行网络通信是基于TCP协议的包括客户端和服务器端两个部分验证了客户机/服务器模型,聊天室客户端程序实例,1.生成对话框程序mychat,选中WindowsSockets;2.制作如下对话框,3.生成CMyAsyncSocket类派生于CAsyncSocket;添加指向CMychatDlg类的指针作成员变量(在实现文件中加入#include“mychatDlg.h”)classCMyChatDlg;classCMyAsyncSocket:publicCAsyncSocket/Attributespublic:CMyChatDlg*m_pDlg;4.在CMychatDlg类中添加CMyAsyncSocketm_Socket;,5.在OnInitDialog()中添加代码:,CStringstrLocalHostIP;strLocalHostIP.LoadString(IDS_LOCALHOST_IP);GetDlgItem(IDC_SERVERIP)-SetWindowText(strLocalHostIP);m_Socket.m_pDlg=this;(添加本机IP地址资源定义),6.添加连接按钮的代码:,if(m_Socket.m_hSocket=INVALID_SOCKET)Connect();elseDisConnect();,7.添加连接函数Connect,intnErr;if(!m_Socket.Create()MessageBox(“创建套接字错误”);return;GetDlgItem(IDC_CONNECT)-EnableWindow(FALSE);GetDlgItem(IDC_SERVERIP)-EnableWindow(FALSE);m_Socket.AsyncSelect(FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);CStringstrServerIP;GetDlgItemText(IDC_SERVERIP,strServerIP);if(!m_Socket.Connect(strServerIP,TCP_PORT)nErr=m_Socket.GetLastError();if(nErr!=WSAEWOULDBLOCK)DisConnect();MessageBox(“连接服务器错误”);注意定义端口:#defineTCP_PORT1107(最好比1024大),m_Socket.Close();GetDlgItem(IDC_CONNECT)-SetWindowText(“连接”);GetDlgItem(IDC_SERVERIP)-EnableWindow(TRUE);GetDlgItem(IDC_CONNECT)-EnableWindow(TRUE);GetDlgItem(IDC_MSG)-EnableWindow(FALSE);GetDlgItem(IDC_SEND)-EnableWindow(FALSE);,8.添加断开函数DisConnect,intnLen;charchBuf4096;GetDlgItemText(IDC_MSG,chBuf,sizeof(chBuf);nLen=lstrlen(chBuf);if(nLen)if(m_Socket.Send(chBuf,nLen+1)=SOCKET_ERROR)if(m_Socket.GetLastError()=WSAEWOULDBLOCK)GetDlgItem(IDC_SEND)-EnableWindow(FALSE);SetDlgItemText(IDC_MSG,NULL);,9.为发送按钮添加命令响应函数,voidCMychatDlg:RecvData()intnLen;charchBuf4096;if(m_Socket.Receive(chBuf,sizeof(chBuf)!=SOCKET_ERROR)nLen=m_cntlInfo.GetWindowTextLength();m_cntlInfo.SetSel(-1,0);m_cntlInfo.ReplaceSel(chBuf);m_cntlInfo.LineScroll(1);(m_cntlInfo是为IDC_INFO添加的控制类型变量),10.添加RecvData函数接收服务器数据,11.添加套接字通知消息处理函数,voidCMyAsyncSocket:OnReceive(intnErrorCode)m_pDlg-RecvData();CAsyncSocket:OnReceive(nErrorCode);voidCMyAsyncSocket:OnSend(intnErrorCode)(m_pDlg-GetDlgItem(IDC_SEND)-EnableWindow(TRUE);CAsyncSocket:OnSend(nErrorCode);,voidCMyAsyncSocket:OnConnect(intnErrorCode)if(nErrorCode=0)(m_pDlg-GetDlgItem(IDC_CONNECT)-SetWindowText(断开);(m_pDlg-GetDlgItem(IDC_CONNECT)-EnableWindow(TRUE);(m_pDlg-GetDlgItem(IDC_SERVERIP)-EnableWindow(FALSE);(m_pDlg-GetDlgItem(IDC_MSG)-EnableWindow(TRUE);(m_pDlg-GetDlgItem(IDC_SEND)-EnableWindow(TRUE);elsem_pDlg-DisConnect();AfxMessageBox(“连接错误);CAsyncSocket:OnConnect(nErrorCode);voidCMyAsyncSocket:OnClose(intnErrorCode)if(m_pDlg)m_pDlg-DisConnect();CAsyncSocket:OnClose(nErrorCode);,聊天室服务器端程序实例,1.生成对话框程序mychatsrvr,选中WindowsSockets;2.制作如下对话框,3.生成监听套接字类和通信套接字类CListenSocket类和CClientSocket类派生于CAsyncSocket;添加指向CMyChatSrvrDlg类的指针作成员变量classCMyChatSrvrDlg;classCMyAsyncSocket:publicCAsyncSocket/Attributespublic:CMyChatSrvrDlg*m_pDlg;(注意添加#include“mychatsrvrDlg.h”在*.cpp中)4.在CMychatSrvrDlg类中添加监听套接字CListenSocketm_ListenSock;,5.服务器端采用并发方式为客户提供服务,所以要维护一个通信套接字的链表。链表中的每个表项都与一个对应的客户端套接字进行着通信。,#includeListenSocket.h#includeClientSocket.hclassCMychatSrvrDlg:publicCDialog/Implementationprotected:HICONm_hIcon;CListenSocketm_ListenSock;CObListm_ClientList;,6.在OnInitDialog()中添加代码:,m_ListenSock.m_pDlg=this;if(!m_ListenSock.Create(TCP_PORT,SOCK_STREAM,FD_ACCEPT,NULL)AfxMessageBox(“监听套接字失败!”);returnFALSE;m_ListenSock.Listen();,6.添加加入客户函数:,voidCMyChatSrvrDlg:AddClient()CClientSocket*pSocket=newCClientSocket;pSocket-m_pDlg=this;if(!m_ListenSock.Accept(*pSocket)AfxMessageBox(接收信息出错!);deletepSocket;return;pSocket-AsyncSelect(FD_READ|FD_CLOSE);m_ClientList.AddTail(pSocket);SetDlgItemInt(IDC_COUNT,m_ClientList.GetCount(),FALSE);,7.添加删除客户函数:,voidCMyChatSrvrDlg:RemoveClient(CClientSocket*pSocket)POSITIONnPos=m_ClientList.GetHeadPosition();POSITIONnTmpPos=nPos;while(nPos)CClientSocket*pSockItem=(CClientSocket*)m_ClientList.GetNext(nPos);if(pSockItem-m_hSocket=pSocket-m_hSocket)pSockItem-Close();deletepSockItem;m_ClientList.RemoveAt(nTmpPos);SetDlgItemInt(IDC_COUNT,m_ClientList.GetCount(),FALSE);return;nTmpPos=nPos;,8.添加数据接收函数,voidCMyChatSrvrDlg:RecvData(CClientSock
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 明星考试题及答案
- 风雨考试题及答案
- 咖啡考试题及答案
- 中级财务会计(山东工商学院)知到智慧树答案
- 建筑起重机械防御台风培训考试试题(附答案)
- 国家基层高血压、糖尿病防治管理指南培训考核试题及答案
- 2025版新能源汽车租赁及代购一体化服务合同
- 2025年工业自动化设备购销合同样本
- 2025年全新建材代购代理合同
- 2025版市政道路施工合同gf
- 2025年建筑工程-安全员C证-安全员(C证·上海)历年参考题库典型考点含答案解析
- 光伏项目施工组织设计方案
- 2025至2030医学混合成像系统行业产业运行态势及投资规划深度研究报告
- 2025年内蒙古交通集团考试笔试试题(含答案)
- 低压安全隐患排查
- 学堂在线 高技术与现代局部战争 章节测试答案
- 水费收缴使用管理办法
- 广东省汕头市金平区2023-2024学年七年级下学期期末数学试题(无答案)
- 中央供料系统介绍
- 输液泵/微量注射泵使用技术操作考核评分标准
- PWM控制技术的最新科技成果-介绍ISL6752
评论
0/150
提交评论