`
逆风的香1314
  • 浏览: 1399633 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
 

接上篇...

五、发送接口<!----><o:p></o:p>

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

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

 <o:p></o:p>

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

 <o:p></o:p>

        EnterCriticalSection( &_csec_soc ) ;

        try

        {

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

        }

        catch( ... )

        {

        }

        LeaveCriticalSection( &_csec_soc ) ;

 <o:p></o:p>

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

        {

            err = API_E_SO_SENDERR ;

            continue ;

        }

 <o:p></o:p>

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

        if( _pkg->resp == false )

        {

            err = 0 ;

            break ;

        }

 <o:p></o:p>

        //等待回应事件

        …………

    }

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

    if( err == API_E_SO_OVETIME )

    {

        _needacttest = _needacttest + 1 ;

    }

       return err;

 <o:p></o:p>

六、接收接口<o:p></o:p>

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

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

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

 <o:p></o:p>

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

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

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

 <o:p></o:p>

        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( ... )

        {

        }

 <o:p></o:p>

 <o:p></o:p>

七、分析协议包<o:p></o:p>

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

unsigned char _result = 0 ;

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

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

 <o:p></o:p>

    if( _msg->msglen <= 0 )

    {

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

    }

    else if( _msg->msglen > 200 )

    {

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

    }

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

    {

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

    }

 <o:p></o:p>

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

    if( _result > 0 )

    {

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

        return ;

    }

              

        if( _fCltGetDeliver )

{

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

//调函数传递数据

……………

}

else

{

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

………….

}

 待续.....

 <o:p></o:p>

分享到:
评论

相关推荐

    CMPP2.0实现

    包含接口API与测试工程: 主目录下是详细使用手册.接口文件放在API文件夹中. Demo Project中包含两个示例工程. 一个是模拟网关的源码--“CMPPGateway” 一个是SP连接网关的示例代码--“SPClient”

    API of EMPP

    上海移动通讯开发的短信服务平台,企业短信通中文手册。

    基于短信应用的SP服务平台java源码

    目前系统实现并支持的协议有cmpp2.0、cmpp3.0、sgip、cngp、smgp3)等。通讯接口均参照标准协议实现未使用任何第三方的API,我们可以通过灵活的配置以支持不同的运营商(经实际测试和不同的网关厂商兼容性均良好)。 *...

    短信网关SP端应用程序接口使用详细说明.docx

    该API基于CMPPv2.0协议,这是中国移动广泛采用的短消息协议。通过此接口,SP可以创建连接,发送和接收短信,同时可以选择长连接或短连接模式,并自行处理连接的建立和断开。API不负责流量控制、重发机制和并发处理,...

    java开源包3

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包1

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包11

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包2

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包6

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包5

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包10

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包4

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包8

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包7

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包9

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包101

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    Java资源包01

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    JAVA上百实例源码以及开源项目

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    JAVA上百实例源码以及开源项目源代码

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

Global site tag (gtag.js) - Google Analytics