h5游戏中网络通信不在使用二进制协议,而是使用websocket(ws) 或者使用基于https的wss进行通信,但是已经自己实现过n次二进制协议通信了,所以也不想使用第三方库的实现。下面就介绍下如何使用c++自己实现一个ws服务器,下一篇文章在介绍wss实现。其实ws的实现只是在二进制协议的基础上增加了一层简单的封装而已,实现并不难。下面介绍ws相关的处理,不会详细介绍epoll的实现部分。
首先ws在连接服务器后第一个包是http中get方法的握手协议包,所以对于第一个包需要特殊处理,握手包的处理代码如下:
bool CWSClientSocket::WSHandshake()
{
if (m_pRecvBuf->GetSize() < PACKHEADSIZE)return true;//包长不够
NetBuffer arrBuf[2];
m_pRecvBuf->GetReadEnable(arrBuf);
uint32_t nContentPos = 0;
uint32_t nContentLen = 0;
int nRet = GetLength(arrBuf[0].buf, arrBuf[0].len, nContentPos, nContentLen);//检查http协议包是否完整
if (nRet == -1)return false;//不支持的协议头解析
if (0 == nRet) return true;//数据不全
if (memcmp(arrBuf[0].buf, "GET ", 4) != 0)return false;//协议头错误
auto pBegin = strstr(arrBuf[0].buf, "Sec-Web