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