void zp_ClusterNode::SendHelloPackage() { int nMsgLen = sizeof(CROSS_SVR_MSG::tag_header) + sizeof (CROSS_SVR_MSG::uni_payload::tag_CSM_BasicInfo); QByteArray array(nMsgLen,0); CROSS_SVR_MSG * pMsg =(CROSS_SVR_MSG *) array.data(); pMsg->hearder.Mark = 0x1234; pMsg->hearder.data_length = sizeof (CROSS_SVR_MSG::uni_payload::tag_CSM_BasicInfo); pMsg->hearder.messagetype = 0x01; strncpy((char *)(pMsg->payload.basicInfo.name), m_pTerm->name().toStdString().c_str(), sizeof(pMsg->payload.basicInfo.name)-1); strncpy((char *)(pMsg->payload.basicInfo.Address_LAN), m_pTerm->LANAddr().toString().toStdString().c_str(), sizeof(pMsg->payload.basicInfo.Address_LAN)-1); pMsg->payload.basicInfo.port_LAN = m_pTerm->LANPort(); strncpy((char *)(pMsg->payload.basicInfo.Address_Pub), m_pTerm->PublishAddr().toString().toStdString().c_str(), sizeof(pMsg->payload.basicInfo.Address_Pub)-1); pMsg->payload.basicInfo.port_Pub = m_pTerm->PublishPort(); emit evt_SendDataToClient(sock(),array); }
/** * @brief This slot send some data to a client. * Because a client socket is actually belongs to a transfer-thread, * this event will be re-fired as evt_SendDataToClient, transfer-threads will * @fn zp_net_Engine::SendDataToClient * @param objClient The destin client * @param dtarray data to be sent */ void zp_net_Engine::SendDataToClient(QObject * objClient,QByteArray dtarray) { emit evt_SendDataToClient(objClient,dtarray); }
//!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; }