CAsyncSocket之运作流程
来源:互联网 发布:2016网络主播排行榜 编辑:程序博客网 时间:2024/05/17 01:41
使用CAsyncSocket时,Send流程和Recieve流程是不同的,不理解这一点就不可能顺利使用CAsyncSocket。
MSDN对CAsyncSocket的解释很容易让你理解为:只有OnSend被触发时你Send才有意义,你才应该Send,同样只有OnRecieve被触发时你才应该Recieve。很不幸,你错了:
你会发现,连接建立的同时,OnSend就第一次被触发了,嗯,这很好,但你现在还不想Send,你让OnSend返回,干点其他的事情,等待下一次OnSend试试看?实际上,你再也等不到OnSend被触发了。因为,除了第一次以外,OnSend的任何一次触发,都源于你调用了Send,但碰到了WSAEWOULDBLOCK或只完成了部分发送!所以,使用CAsyncSocket时,针对发送的流程逻辑应该是:你需两个成员变量,一个发送任务表,一个记录发送进度。你可以,也应该,在任何你需要的时候,主动调用Send来发送数据,同时更新任务表和发送进度。而OnSend,则是你的负责擦屁股工作的助手,它被触发时要干的事情就是根据任务表和发送进度调用Send继续发,若此次发送没能将任务表全部发送完成,根据发送结果更新发送进度;若任务表已全部发送完毕,则清空任务表及发送进度。
使用CAsyncSocket的接收流程逻辑是不同的:你永远不需要主动调用Recieve,你只应该在OnRecieve中等待。由于你不可能知道将要抵达的数据类型及次序,所以你需要一个成员变量来存储已收到但尚未处理的数据。每次OnRecieve被触发,你只需要被动调用一次Recieve来接受固定长度的数据,并添加到你的已收数据表后。然后你需要扫描已收数据表,若其中已包含一条或数条完整的可解析的业务数据包,截取出来,调用主线程的处理函数来处理或作为消息参数发送给主线程。而已收数据表中剩下的数据,将等待下次OnRecieve中被再次组合、扫描并处理。
在长连接应用中,连接可能因为各种原因中断,所以你需要自动重连。你需要根据CAsyncSocket的成员变量m_hSocket来判断当前连接状态:
if(m_hSocket==INVALID_SOCKET)
当然,很奇怪的是,即使连接已经中断,OnClose也已经被触发,你还是需要在OnClose中调用Close,否则m_hSocket并不会被自动赋值为INVALID_SOCKET。
在很多长连接应用中,除建立连接以外,还需要先Login,然后才能进行业务处理,连接并Login是一个步骤依赖性过程,用异步方式处
理反而会很麻烦,而CAsyncSocket是支持切换为同步模式的,你应该掌握在适当的时候切换同异步模式的方法:
DWORD dw;
//切换为同步模式
dw=0;
IOCtl(FIONBIO,&dw);
...
//切换回异步模式
dw=1;
IOCtl(FIONBIO,&dw);
(完)
- CAsyncSocket之运作流程
- CAsyncSocket运作流程
- JCL,JES运作流程
- fanfoudroid 总体运作流程
- Struts1基本运作流程
- ThreadPoolExecutor运作流程
- MFC之CAsyncSocket详解
- MFC之CAsyncSocket详解
- MFC之CAsyncSocket详解
- [Mybatis] Mybatis运作流程分析
- Tensorflow运作之变量
- CAsyncSocket
- CAsyncSocket
- CAsyncSocket
- CAsyncSocket
- CAsyncSocket
- CAsyncSocket
- CAsyncSocket
- 在SQL Server中查询本周 本月 本期, 本年的记录
- 创业就像过河(献给那些想过河和正在过河的朋友们)
- java webservice的开发(eclipse3.4+xfire+tomcat5.5)
- 写得蛮好的linux学习笔记(一)(linux目录架构)
- [双语阅读]英研究:牲畜吃蒜减少打嗝可抑制全球变暖
- CAsyncSocket之运作流程
- 劳资纠纷 labor dispute
- pl sql developer查看历史sql记录
- 写得蛮好的linux学习笔记(二)(一些常用的基本命令)
- 什么是“净就业前景指数”
- 大学毕业生们的25种经典总结
- Screw up 搞砸了
- 电压表的工作原理
- 写得蛮好的linux学习笔记(三)(压缩命令)