协议开发 中移动CMPP2.0协议API(三)

云网(jimzj@21cn.com)

接上篇...

五、发送接口

对于API来说,最重要的一部分就是去做发送数据了。通过SOCKET套接字与网关相连接后,将自己的数据发送出去。

在发送数据前,组装好要发送的数据包,将数据COPY一份到发送窗口,对于不要回应的数据包,只要发送成功,就可以退出发送进程。对于要等待回应的包,启动一个时钟来作为检测是否收到了回应,并返回结果给发送窗口。设置发送的次数标志,如果发送第一次超时,按设定的发送次数,再发送。如果出现一次发送不成功,可以设置一个标志位,去发送一次链路检测标志,如果链路检测失败,应该重新连接或者是在用户发送时直接返回链路断开的结果。

CMPP_PACKAGE * _pkg = ( CMPP_PACKAGE * )buf ;

int err = API_E_UNKNOW_ERR ;

if( _soc == INVALID_SOCKET ) return API_E_INVALT_SOC ;

while( _pkg->n > 0 )

{

_pkg->n = _pkg->n - 1 ;   //发送次数

_lastacttime = time( NULL ) ;

EnterCriticalSection( &_csec_soc ) ;

try

{

err = send( _soc, buf, len, 0 ) ;

}

catch( ... )

{

}

LeaveCriticalSection( &_csec_soc ) ;

if( err < len ) //发送不成功

{

err = API_E_SO_SENDERR ;

continue ;

}

//不要回应结果的直接跳出

if( _pkg->resp == false )

{

err = 0 ;

break ;

}

//等待回应事件

…………

}

//如果发送超时,设置发送链路检测标志开

if( err == API_E_SO_OVETIME )

{

_needacttest = _needacttest + 1 ;

}

return err;

六、接收接口

        对于数据的接收,因为发送短信的接口的数据量并不是很大,所以可以采用接收到

一部分,解释一部分的功能,这样的就可以减少设计上的难度,当然也可以一次接收缓冲中的数据,再一段段去分析,也不是很难。

对于接收,启用一个新的线程,这样也可以保证接收的及时性与可调度性。先接收包头信息确定整个数据包的长度,直到接收到一个完整的包的内容才进行下一个包的接收,有些包也可能是没有包体结构的,所以也可以在收到正确的包头后就进行分析结构如下:

//先接收包头部分,以确定包的大小、类型

err = _pscoket->_recv( _pscoket->_rec_window, sizeof( CMPP_HEAD )) ;

if( err == SOCKET_ERROR || err == API_E_INVALT_SOC ) continue ;

CMPP_PACKAGE * _recpkg = ( CMPP_PACKAGE * )_pscoket->_rec_window ;

if( ntohl( _recpkg->head.size ) > 0 )

{

//接收包体

_reclen = 0 ;   //已接收长度

_recdatalen = ntohl( _recpkg->head.size ) - sizeof( _recpkg->head ) ;

do

{

Sleep( 1 ) ;

_recdatalen = _recdatalen - _reclen ;

err = _pscoket->_recv( _recpkg->data + _reclen, _recdatalen );

if( err == SOCKET_ERROR || err == API_E_INVALT_SOC ) continue ;

_reclen = err ;

} while( _recdatalen - _reclen > 0 ) ;

if( _recdatalen > _reclen ) continue ;

}

try

{

_pscoket->_analysisrecpack( _recpkg ) ;  //分析包的内容

}

catch( ... )

{

}

七、分析协议包

接收到CMPP的一个完整的协议包后,根据命令字去作分析,相对来说并不是一个很难的事情,不过要注意是就是要把网络数据流转化为主机数据流这个问题。

unsigned char _result = 0 ;

CMPP_DELIVER * _msg = ( CMPP_DELIVER * )_recpkg->data ;

DELIVER_CONTENT * _pcont = ( DELIVER_CONTENT *)_msg->msgcontent ;

if( _msg->msglen <= 0 )

{

_result = 4 ; //接收到的长度前误,要求网关服务器重发这个包

}

else if( _msg->msglen > 200 )

{

_result = 6 ; //接收到的长度前误,要求网关服务器重发这个包

}

else if( _msg->delivery != 0 || _msg->delivery !=  1 )

{

_result = 1 ; //接收到的协议格式有误,要求网关服务器重发这个包

}

//接收到错误的信息直接返回

if( _result > 0 )

{

_deliverresp( _recpkg->head.seqid, _msg->msgid, _result ) ;

return ;

}

if( _fCltGetDeliver )

{

//如果客户端程序采用的是回调函数来取得接收到的短信或状态,调用回

//调函数传递数据

……………

}

else

{

//如果客户端采用的是自已从队列中提取的方式,把数据直接PUSH到队//列中等待用户提取

………….

}

待续.....

作者Blog:http://blog.csdn.net/jimzj/

转载于:https://www.cnblogs.com/bobox/archive/2007/01/21/626010.html

协议开发 中移动CMPP2.0协议API(三)相关推荐

  1. 软件系统开发中的数据交换协议

    在很多地方都有"数据交换"这个概念,本文所说的"数据交换" 是指在计算机网络中,一个系统把数据传递给另外一个系统.这非常类似于一个人要告诉另外一个人一件事情. ...

  2. 【UE4】网游开发中的RPC和OnRep(三)

    [UE4]网游开发中的RPC和OnRep(三) 本文转自我的公众号-游戏开发手账 转载请标明出处 最后说说怎么用OnRep完成子弹的同步. OnRep 使用属性同步也能够完成Client和Server ...

  3. 协议4中dns服务器地址,协议4中dns服务器地址

    协议4中dns服务器地址 内容精选 换一换 本教程将指引您搭建一个IPv4网段的VPC,并为VPC中的ECS绑定一个弹性公网IP访问Internet.配置流程如图1所示.在创建VPC之前,您需要根据具 ...

  4. 禾川兴科技PD协议芯片LDR6282 DRP PD3.0协议芯片

    LDR 6282是一种双端口usb型C控制器,具有显示PortTM交替模式,特别是 设计用于USB PD对接站的视频输出.LDR 6282能够作为双重角色工作. 设备(提供者或消费者).LDR 628 ...

  5. 用C#做短信CMPP2.0/3.0协议 支持扩展号支持物理网卡

    此程序为中国移动CMPP协议程序接口,适合在中国移动申请了短信发送端口的公司使用. 短信群发已经成为现在软件系统.网络营销等必不可少的应用工具.可应用在短信验证.信息群发.游戏虚拟商品购买.事件提醒. ...

  6. 软件开发中的几种数据交换协议

    在很多地方都有"数据交换"这个概念,本文所说的"数据交换" 是指在计算机网络中,一个系统把数据传递给另外一个系统.这非常类似于一个人要告诉另外一个人一件事情. ...

  7. 深入理解OAuth2.0协议

    1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...

  8. 最近在学OAuth2.0协议,给大家分享一下

    1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...

  9. TCP协议调试工具TcpEngine V1.3.0使用教程

    简介 这里说的TCP协议调试定义是在开发长连接TCP协议应用时,为了验证代码流程或查找bug,需要与对端交互数据过来,当需要时可以暂停发送:单条发送:跳过发送:正常发送:发送时修改数据等. TcpEn ...

最新文章

  1. Windows驱动程序的分类
  2. Linux快捷键及文件和目录的操作
  3. 深度学习总结:用pytorch做dropout和Batch Normalization时需要注意的地方,用tensorflow做dropout和BN时需要注意的地方,
  4. 等待CreateProcess进程退出
  5. lvm-snapshot:基于LVM快照的备份
  6. mysql linux 优化_mysql在linux中内核优化
  7. php源码怎样安装mysql_Linux下源码包安装mysql、apache以及php
  8. HDU 2296 Ring -----------AC自动机,其实我想说的是怎么快速打印字典序最小的路径...
  9. 欢迎来怼--第二十九次Scrum会议
  10. 使用bat命令批量命名图片名称的方法及解决bat格式中文乱码的问题(如:图片.jpg)
  11. MySQL5.7安装包安装
  12. 《神经网络与深度学习》- 邱锡鹏(更新)
  13. MySQL数据库增删改查的SQL语句
  14. C语言 判断一个数是不是质数(素数)
  15. 计算机中专生实习单位的鉴定表,中专生的实习自我鉴定(精选5篇)
  16. vue-amap的使用
  17. 探索 TDengine在《图码联侦》项目中的应用可行性及实践研究(new)
  18. 流媒体服务器,red5,EsayDSS,AdobeMediaServer5和阿里推流服务性能对比。flash播放器JWplayer CKplayers Aliplayer性能对比
  19. Salary Inequity
  20. 第三方登录-[微博、微信、qq] java实现

热门文章

  1. 编程微刊第五期文章汇总(2018.5)
  2. 【codeforces 766E】Mahmoud and a xor trip
  3. ASP.NET MVC4 路由的配置 十种方法
  4. Ubuntu 下安装 nfs
  5. 3.以太坊之秘钥文件
  6. 《R语言编程艺术》——2.5 使用all()和any()
  7. 使用Hibernate操作数据库
  8. shell高级(一)
  9. linux 禁止SU 登录
  10. centos下fail2ban安装与配置详解