解码websocket (c++)

本文介绍了WebSocket协议的原理,并展示了使用C++进行WebSocket协议解码的步骤,包括判断HTTP升级握手、解码HTTP以及解析WebSocket帧结构,如FIN、RSV、OPCODE、Payload长度和掩码等关键字段。
摘要由CSDN通过智能技术生成

websocket 是web常用的协议,可用来支持自定义协议。

以下是用c++根据websocket握手协议websocket协议格式来处理websocket 协议解码

(1)第一步,websocket升级协议

判断是否是http协议,并且是websocket的升级握手协议

E_CODEC_STATUS CodecWebSocketJson::Decode(tagConnectionAttr* pConn,MsgHead& oMsgHead, MsgBody& oMsgBody)
{
    if (eConnectStatus_init == pConn->ucConnectStatus)//必须以http请求初始化握手协议,否则不是WebSocketJson协议
    {
        if (pConn->pRecvBuff->ReadableBytes() >= 5)//目前只支持Get post 的初始化握手协议
        {
            //响应的是("HTTP/", 5)
            //请求的是("GET ", 4)  ("POST ", 5)
            const char* pReadAddr = pConn->pRecvBuff->GetRawReadBuffer();//处理http请求
            if ((memcmp(pReadAddr, "GET ", 4) == 0)
                            || memcmp(pReadAddr, "POST ", 5) == 0)
            {
                LOG4_TRACE("%s() pBuff->ReadableBytes() = %u:%s", __FUNCTION__,
                                pConn->pRecvBuff->ReadableBytes(), pConn->pRecvBuff->ToString().c_str());
                HttpMsg oHttpMsg;
                E_CODEC_STATUS eCodecStatus = Decode(pConn->pRecvBuff, oHttpMsg);
                if (CODEC_STATUS_OK == eCodecStatus)
                {
                    std::string upgrade;
                    for (int i = 0; i < oHttpMsg.headers_size(); ++i)
                    {
                        if (std::string("x-cmd")
                                        == oHttpMsg.headers(i).header_name()
                                        || std::string("x-CMD")
                                                        == oHttpMsg.headers(i).header_name()
                                        || std::string("x-Cmd")
                                                        == oHttpMsg.headers(i).header_name())
                        {
                            oMsgHead.set_cmd(atoi(oHttpMsg.headers(i).header_value().c_str()));
                        }
                        else if (std::string("x-seq")
                                        == oHttpMsg.headers(i).header_name()
                                        || std::string("x-SEQ")
                                                        == oHttpMsg.headers(i).header_name()
                                        || std::string("x-Seq")
                                                        == oHttpMsg.headers(i).header_name())
                        {
                            oMsgHead.set_seq(strtoul(oHttpMsg.headers(i).head
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值