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