mfc套接字.docx_第1页
mfc套接字.docx_第2页
mfc套接字.docx_第3页
mfc套接字.docx_第4页
mfc套接字.docx_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CAsyncSocket这几天都在研么MFC的套接字类CAsyncSocket的用法, 将一些心得和实践中遇到的问题总结一下。一、一些网络的基本概念1.同步:指的是发送方不等接收方响应,便接着发下个数据包的通信方式;2.异步:指发送方发出数据后,等收到接收方发回的响应,才发下一个数据包的通信方式3.阻塞:指调用某函数时,直到该函数完成操作,才返回;否则一直阻塞在该调用上4.非阻塞:指调用某操作时,不管操作是否成功都立即返回,而不会挂在该操作上CAsyncSocket属于异步非阻塞类;CSocket是MFC在CAsyncSocket基础上派生的一个同步阻塞Socket的封装类二、CAsyncSocket的使用(伪码)服务器端:m_pListSocket=new CAsyncSocket();m_pListSocket-Create( 端口,地址);/创建m_pListSocket-Listen();/开始监听m_pListSocket:OnAccept( )/有客户端请求连接时响应m_pSocket=new CAsyncSocket();m_pListSocket-Accept(m_pSocket);/建立通信,成功后m_pSocket就用于发送和接受./m_pSocket 就相当于连接的那个客户端了m_pSocket:OnRecive(intnErrorCode)if( nErrorCode=0) Recevie();/接受客户端发送来的信息 CAsyncSocket:OnRecive( nErrorCode)m_pSocket:OnSend() Send();/发送信息,该事件触发条件见下节m_pListSocket-Close();delete m_pListSocket;delete m_pSocket;客户端:m_pClientSocket=new CAsyncSocket();m_pClientSocket-Create( 端口,地址);/创建m_pClientSocket-Connect();/连接服务器,最终将触发服务器的OnAccept();m_ pClientSocket:OnConnect()/当连接上服务器m_ pClientSocket:OnRecive(intnErrorCode)if( nErrorCode=0) Recevie();/接受客户端发送来的信息 CAsyncSocket:OnRecive( nErrorCode)m_pClientSocket:OnSend(intnErrorCode) Send();/发送信息m_pClientSocket-Close();三、CAsyncSocket异步机制由于CAsyncSocket采用的是异步非阻塞机制,所以你随时可以发包,也随时可能收到包。发送、接收函数都是异步非阻塞的,顷刻就能完成,所以收发交错进行着。也正因为如此,仅调用它们并不能保障发送或接收的完成。例如发送函数Send,调用它可能有3种结果:错误、部分完成、全部完成。其中错误又分两种情况:一种是由各种网络问题导致的失败,你需要马上决定是放弃本次操作,还是启用某种对策;另一种是“忙”,你实际上不用马上理睬。你需要调用GetLastError来判断是哪种情况,GetLastError返回WSAEWOULDBLOCK,代表“忙”,为什么当你Send得到WSAEWOULDBLOCK却不用理睬呢?因为CAsyncSocket会记得你的SendWSAEWOULDBLOCK了,待发送的数据会写入CAsyncSocket内部的发送缓冲区,并会在不忙的时候自动调用OnSend,发送内部缓冲区里的数据。同样,如果Send只完成了一部分,你也不需要理睬,尚未发送的数据同样会写入CAsyncSocket内部的发送缓冲区,并在不“忙”的时候自动调用OnSend完成发送。与OnSend协助Send完成工作一样,OnRecieve、OnConnect、OnAccept也会分别协助Recieve、Connect、Accept完成工作。这一切都通过消息机制完成。在你使用CAsyncSocket之前,必须调用AfxSocketInit初始化WinSock环境,而AfxSocketInit会创建一个隐藏的CSocketWnd对象,由于这个对象由Cwnd派生,因此它能够接收Windows消息。一方面它会接受各个CAsyncSocket的状态报告,另一方面它能捕捉系统发出的各种SOCKET事件。所以它能够成为高层CAsyncSocket对象与WinSock底层之间的桥梁:例如某CAsyncSocket在Send时WSAEWOULDBLOCK了,它就会发送一条消息给CSocketWnd作为报告,CSocketWnd会维护一个报告登记表,当它收到底层WinSock发出的空闲消息时,就会检索报告登记表,然后直接调用报告者的OnSend函数。所以前文所说的CAsyncSocket会自动调用OnXxx,实际上是不对的,真正的调用者是CSocketWnd它是一个CWnd对象,运行在独立的线程中。四、网络事件处理流程在理解了上面的机制后,让我们了解下CAsyncSocket的通信流程;OnSend,除了在对方发送消息来的时候响应外,还会在缓冲区有空闲的时候自动触发;如果每次发送的数据比较简单,不会造成WASEWOULDBLOCK(阻塞),不会触发OnSend;因此小数据直接Send就行了,大数据就需要在OnSend判断数据发送是否正确;如何手动触发OnSend()呢,采用AsyncSelect( FD_WRITE),通知CsocketWnd窗口处理写数据操作;同样AsyncSelect(FD_READ)将通知CsocketWnd窗口当有消息传来的时候触发OnRecevie();BOOLAsyncSelect( long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE ); /请求Socket响应以上事件五、消息为何只接收一次编程中遇到这个问题,发现很多人都遇到过这个问题。症状如下:Socket连接后只能发送一次消息,发送第二次消息的时候,另一方就接收不到;原因是:没有让Socket改变响应事件的发式解决方法:在OnReceive()中,Receive()后调用AsyncSelect(FD_READ);VoidCMyAsyncSocket:OnReceive(intnErrorCode)Receive();AsyncSelect(FD_READ);或则调用父类的OnReceive()VoidCMyAsyncSocket:OnReceive(intnErrorCode)Receive();CAsyncSo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论