Exemplo n.º 1
0
void BaseConn::_ParsePkt()
{
    try {
		PktBase* pPkt = NULL;
		while ( (pPkt = PktBase::ReadPacket(m_in_buf.GetReadBuffer(), m_in_buf.GetReadableLen())) ) {
			uint32_t pkt_len = pPkt->GetLength();

			HandlePkt(pPkt);
            
			m_in_buf.Read(NULL, pkt_len);
			delete pPkt;
            
            if (m_handle == NETLIB_INVALID_HANDLE) {
                // 有可能处理数据包后就关闭了连接, 再处理数据包会crash,所以这里要这么判断下
                break;
            }
		}
        
        m_in_buf.ResetOffset();
	} catch (PktException& ex) {
        if (ex.GetErrorCode() == ERROR_CODE_WRONG_PKT_LEN) {
            printf("!!!exception, err_msg=%s\n", ex.GetErrorMsg());
        } else {
            // 读取包头来确认pkt_id
            pkt_header_t header;
            PktBase::ReadPktHeader(m_in_buf.GetReadBuffer(), PKT_HEADER_LEN, &header);
            printf("!!!exception: pkt_len=%d, pkt_id=%d, err_msg=%s\n",
                   header.length, header.pkt_id, ex.GetErrorMsg());
        }
        
        OnClose();
	}
}
Exemplo n.º 2
0
	void Add(const SocketClientData_t & sClient ,const char * pData ,int nDataLen)
	{
		std::string & strData = m_userRequests[sClient];
		strData.insert(strData.end(), pData, pData+nDataLen);

		while(strData.size() > 4)
		{
			int nPktLen = *(int*)&strData[0];
			if((int)strData.size() >= (nPktLen + 4))
			{
				HandlePkt(sClient, &strData[4], nPktLen);
				strData = strData.substr(nPktLen+4);
			}
			else
			{
				break;
			}
		}

	}