CAsyncSocket运作流程

转载 2012年03月27日 21:46:53

使用CAsyncSocket时,Send流程和Recieve流程是不同的,不理解这一点就不可能顺利使用CAsyncSocket。

编辑摘要

 

CAsyncSocket运作流程 - 概述



MSDN对CAsyncSocket的解释很容易让你理解为:只有OnSend被触发时
你Send才有意义,你才应该Send,同样只有OnRecieve被触发时你才
应该Recieve。很不幸,你错了:

你会发现,连接建立的同时,OnSend就第一次被触发了,嗯,这很好,
但你现在还不想Send,你让OnSend返回,干点其他的事情,等待下一
次OnSend试试看?实际上,你再也等不到OnSend被触发了。因为,除
了第一次以外,OnSend的任何一次触发,都源于你调用了Send,但碰
到了WSAEWOULDBLOCK或只完成了部分发送!

所以,使用CAsyncSocket时,针对发送的流程逻辑应该是:你需两个
成员变量,一个发送任务表,一个记录发送进度。你可以,也应该,
在任何你需要的时候,主动调用Send来发送数据,同时更新任务表和
发送进度。而OnSend,则是你的负责擦屁股工作的助手,它被触发时
要干的事情就是根据任务表和发送进度调用Send继续发,若此次发送
没能将任务表全部发送完成,根据发送结果更新发送进度;若任务表
已全部发送完毕,则清空任务表及发送进度。

CAsyncSocket运作流程 - 相关

使用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);

举报

相关文章推荐

Openstack贡献者须知 2 — 社区工作运作 & 代码贡献流程

目录目录 前文列表 订阅邮件列表 Mailing Lists 社区工作运作流程 Openstack 代码贡献流程 PEP8 Python编程风格 查阅相关资源前文列表Openstack贡献者须知 — ...
  • Jmilk
  • Jmilk
  • 2016-07-23 12:39
  • 1726

BOSS系统的流程与运作

广东移动BOSS系统的流程与运作,让你更深入了解其中。BOSS系统介绍             移动通信业务运营支撑系统(Business & Operation Support System,简称B...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Struts2应用的开发步骤和运作流程

本文第1部分是从书上抄来的,第2部分是自己总结书上的。 1.导入相关jar包。   将Struts2的lib文件夹下的commons-fileupload.jar,commons-io.jar,f...

简述 OAuth 2.0 的运作流程

写的通俗易懂,转载自:http://www.barretlee.com/blog/2016/01/10/oauth2-introduce/,谢谢作者。本文将以用户使用 github 登录网站留言为例,...

使用Intent调用其他活动的方法以及运作流程

首先做个说明,本文的写作背景是在sdk 4.4的时代下,而我还在猥琐地使用4.0的教材学习Android开发,自然会有很多看起来比较古怪的东西,例如main.xml这种东西,现在已经一分为二,变为ac...

Ubuntu下跑通py-faster-rcnn、详解demo运作流程

在不同的服务器不同的机器上做过很多次实验,分别遇到各种不一样的错误并且跑通Py-Faster-RCNN,因此,在这里做一个流程的汇总: 一、下载文件: 首先,文件的下载可以有两种途径: 1、需要在官网...

[Mybatis] Mybatis运作流程分析

因为机缘关注起来Mybatis,本文将探索Mybatis的整体执行流程,了解其大概是如何运作的。Mybatis示例 InputStream inputStream = Resources.get...

一个黑头发的技术人员说点产品运作以及流程问题

首先声明,我不是产品经理,也不是项目经理,对做产品、项目,我也不怎么懂,我只是个程序员,现在我只是以“一个程序员”自己的领悟,对一个产品如何运作,说点流程问题: 1)产品前期,调研市场需求,确定此产品...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)