//!deal one message, affect m_currentRedOffset,m_currentMessageSize,m_currentHeader //!return bytes Used. int zp_ClusterNode::filter_message(QByteArray block, int offset) { const int blocklen = block.length(); while (blocklen>offset) { const char * dataptr = block.constData(); //Recieve First 2 byte while (m_currentMessageSize<2 && blocklen>offset ) { m_currentBlock.push_back(dataptr[offset++]); m_currentMessageSize++; } if (m_currentMessageSize < 2) //First 2 byte not complete continue; if (m_currentMessageSize==2) { const char * headerptr = m_currentBlock.constData(); memcpy((void *)&m_currentHeader,headerptr,2); } if (m_currentHeader.Mark == 0x1234) //Valid Message { //while (m_currentMessageSize< sizeof(CROSS_SVR_MSG::tag_header) && blocklen>offset) if (m_currentMessageSize< sizeof(CROSS_SVR_MSG::tag_header) && blocklen>offset) { int nCpy = sizeof(CROSS_SVR_MSG::tag_header) - m_currentMessageSize; if (nCpy > blocklen - offset) nCpy = blocklen - offset; QByteArray arrCpy(dataptr+offset,nCpy); m_currentBlock.push_back(arrCpy); //m_currentBlock.push_back(dataptr[offset++]); //m_currentMessageSize++; offset += nCpy; m_currentMessageSize += nCpy; } if (m_currentMessageSize < sizeof(CROSS_SVR_MSG::tag_header)) //Header not completed. continue; else if (m_currentMessageSize == sizeof(CROSS_SVR_MSG::tag_header))//Header just completed. { const char * headerptr = m_currentBlock.constData(); memcpy((void *)&m_currentHeader,headerptr,sizeof(CROSS_SVR_MSG::tag_header)); //continue reading if there is data left behind if (block.length()>offset) { qint32 bitLeft = m_currentHeader.data_length + sizeof(CROSS_SVR_MSG::tag_header) -m_currentMessageSize ; //while (bitLeft>0 && blocklen>offset) if (bitLeft>0 && blocklen>offset) { int nCpy = bitLeft; if (nCpy > blocklen - offset) nCpy = blocklen - offset; QByteArray arrCpy(dataptr+offset,nCpy); m_currentBlock.push_back(arrCpy); offset += nCpy; m_currentMessageSize += nCpy; bitLeft -= nCpy; //m_currentBlock.push_back(dataptr[offset++]); //m_currentMessageSize++; //bitLeft--; } //deal block, may be send data as soon as possible; deal_current_message_block(); if (bitLeft>0) continue; //This Message is Over. Start a new one. m_currentMessageSize = 0; m_currentBlock = QByteArray(); continue; } } else { if (block.length()>offset) { qint32 bitLeft = m_currentHeader.data_length + sizeof(CROSS_SVR_MSG::tag_header) -m_currentMessageSize ; //while (bitLeft>0 && blocklen>offset) if (bitLeft>0 && blocklen>offset) { int nCpy = bitLeft; if (nCpy > blocklen - offset) nCpy = blocklen - offset; QByteArray arrCpy(dataptr+offset,nCpy); m_currentBlock.push_back(arrCpy); offset += nCpy; m_currentMessageSize += nCpy; bitLeft -= nCpy; //m_currentBlock.push_back(dataptr[offset++]); //m_currentMessageSize++; //bitLeft--; } //deal block, may be processed as soon as possible; deal_current_message_block(); if (bitLeft>0) continue; //This Message is Over. Start a new one. m_currentMessageSize = 0; m_currentBlock = QByteArray(); continue; } } // end if there is more bytes to append } //end deal trans message else { const char * ptrCurrData = m_currentBlock.constData(); emit evt_Message(this,tr("Client Send a unknown start Header %1 %2. Close client immediately.") .arg((int)(ptrCurrData[0])).arg((int)(ptrCurrData[1]))); m_currentMessageSize = 0; m_currentBlock = QByteArray(); offset = blocklen; emit evt_close_client(this->sock()); } } // end while block len > offset return offset; }
//!deal one message, affect m_currentRedOffset,m_currentMessageSize,m_currentHeader //!return bytes Used. int st_clientNode_baseTrans::filter_message(QByteArray block, int offset) { const int blocklen = block.length(); while (blocklen>offset) { const char * dataptr = block.constData(); //Recieve First 2 byte while (m_currentMessageSize<2 && blocklen>offset ) { m_currentBlock.push_back(dataptr[offset++]); m_currentMessageSize++; } if (m_currentMessageSize < 2) //First 2 byte not complete continue; if (m_currentMessageSize==2) { const char * headerptr = m_currentBlock.constData(); memcpy((void *)&m_currentHeader,headerptr,2); } //Heart Beating if (m_currentHeader.Mark == 0xBEBE) { if (m_currentMessageSize< sizeof(EXAMPLE_HEARTBEATING) && blocklen>offset ) { int nCpy = offset - blocklen; if (nCpy > sizeof(EXAMPLE_HEARTBEATING) - m_currentMessageSize) nCpy = sizeof(EXAMPLE_HEARTBEATING) - m_currentMessageSize; m_currentBlock.push_back(QByteArray(dataptr+offset,nCpy)); offset += nCpy; m_currentMessageSize+=nCpy; } if (m_currentMessageSize < sizeof(EXAMPLE_HEARTBEATING)) //Header not completed. continue; //Send back emit evt_SendDataToClient(this->sock(),m_currentBlock); //Try to Get UUID Immediately if (m_bUUIDRecieved==false) { EXAMPLE_HEARTBEATING * pHbMsg = (EXAMPLE_HEARTBEATING *)(m_currentBlock.constData()); if (bIsValidUserId(pHbMsg->source_id)) { m_bUUIDRecieved = true; m_uuid = pHbMsg->source_id; //regisit client node to hash-table; m_pClientTable->regisitClientUUID(this); } } //This Message is Over. Start a new one. m_currentMessageSize = 0; m_currentBlock = QByteArray(); continue; } else if (m_currentHeader.Mark == 0x55AA) //Trans Message { if (m_currentMessageSize< sizeof(EXAMPLE_TRANS_MSG)-1 && blocklen>offset) { int nCpy = blocklen - offset; if (nCpy > sizeof(EXAMPLE_TRANS_MSG)-1 - m_currentMessageSize) nCpy = sizeof(EXAMPLE_TRANS_MSG)-1 - m_currentMessageSize; m_currentBlock.push_back(QByteArray(dataptr+offset,nCpy)); offset += nCpy; m_currentMessageSize+=nCpy; } if (m_currentMessageSize < sizeof(EXAMPLE_TRANS_MSG)-1) //Header not completed. continue; else if (m_currentMessageSize == sizeof(EXAMPLE_TRANS_MSG)-1)//Header just completed. { const char * headerptr = m_currentBlock.constData(); memcpy((void *)&m_currentHeader,headerptr,sizeof(EXAMPLE_TRANS_MSG)-1); //continue reading if there is data left behind if (block.length()>offset) { qint32 bitLeft = m_currentHeader.data_length + sizeof(EXAMPLE_TRANS_MSG) - 1 -m_currentMessageSize ; if (bitLeft>0 && blocklen>offset) { int nCpy = blocklen - offset; if (nCpy > bitLeft) nCpy = bitLeft; m_currentBlock.push_back(QByteArray(dataptr+offset,nCpy)); offset += nCpy; m_currentMessageSize+=nCpy; bitLeft -= nCpy; } //deal block, may be send data as soon as possible; deal_current_message_block(); if (bitLeft>0) continue; //This Message is Over. Start a new one. m_currentMessageSize = 0; m_currentBlock = QByteArray(); continue; } } else { if (block.length()>offset) { qint32 bitLeft = m_currentHeader.data_length + sizeof(EXAMPLE_TRANS_MSG) - 1 -m_currentMessageSize ; if (bitLeft>0 && blocklen>offset) { int nCpy = blocklen - offset; if (nCpy > bitLeft) nCpy = bitLeft; m_currentBlock.push_back(QByteArray(dataptr+offset,nCpy)); offset += nCpy; m_currentMessageSize+=nCpy; bitLeft -= nCpy; } //deal block, may be processed as soon as possible; deal_current_message_block(); if (bitLeft>0) continue; //This Message is Over. Start a new one. m_currentMessageSize = 0; m_currentBlock = QByteArray(); continue; } } // end if there is more bytes to append } //end deal trans message else { const char * ptrCurrData = m_currentBlock.constData(); emit evt_Message(this,tr("Client Send a unknown start Header %1 %2. Close client immediately.") .arg((int)(ptrCurrData[0])).arg((int)(ptrCurrData[1]))); m_currentMessageSize = 0; m_currentBlock = QByteArray(); offset = blocklen; emit evt_close_client(this->sock()); } } // end while block len > offset return offset; }