提交 94722e9d 编写于 作者: 丁劲犇's avatar 丁劲犇 😸

Add major change , to acheive new standard docs.

上级 c3c9ff23
......@@ -106,22 +106,11 @@ void QTcpClientTest::timerEvent(QTimerEvent * evt)
//send heart-beating
foreach(QGHTcpClient * pSock,listObj)
{
quint16 nMsgLen = 0;
QByteArray array(sizeof(SMARTLINK_MSG) + nMsgLen - 1,0);
QByteArray array(sizeof(SMARTLINK_HEARTBEATING),0);
char * ptr = array.data();
SMARTLINK_MSG * pMsg = (SMARTLINK_MSG *)ptr;
pMsg->Mark=0x55AA;
pMsg->version = 1;
pMsg->Priority = 0;
pMsg->Reserved1 = 0;
pMsg->SerialNum = 0;
pMsg->source_id = (quint32)((quint64)(pSock) & 0xffffffff);
pMsg->destin_id = (quint32)0xffffffff;
pMsg->Reserved2 = 0;
pMsg->data_length = nMsgLen;
for (int i=0;i<nMsgLen;i++)
pMsg->data[i] = '0' + i%10;
SMARTLINK_HEARTBEATING * pMsg = (SMARTLINK_HEARTBEATING *)ptr;
pMsg->Mark = 0xBEBE;
pMsg->tmStamp = 0;
//3/10 possibility to send a data block to server
(pSock)->SendData(array);
}
......
......@@ -12,7 +12,6 @@ st_client_table::st_client_table(ZPNetwork::zp_net_ThreadPool * pool, ZPTaskEngi
connect (m_pThreadPool,&ZPNetwork::zp_net_ThreadPool::evt_ClientDisconnected,this,&st_client_table::on_evt_ClientDisconnected,Qt::QueuedConnection);
connect (m_pThreadPool,&ZPNetwork::zp_net_ThreadPool::evt_Data_recieved,this,&st_client_table::on_evt_Data_recieved,Qt::QueuedConnection);
connect (m_pThreadPool,&ZPNetwork::zp_net_ThreadPool::evt_Data_transferred,this,&st_client_table::on_evt_Data_transferred,Qt::QueuedConnection);
}
st_client_table::~st_client_table()
{
......@@ -80,6 +79,7 @@ void st_client_table::on_evt_ClientDisconnected(QObject * clientHandle)
disconnect (pClientNode,&st_clientNode::evt_SendDataToClient,m_pThreadPool,&ZPNetwork::zp_net_ThreadPool::SendDataToClient);
disconnect (pClientNode,&st_clientNode::evt_BroadcastData,m_pThreadPool,&ZPNetwork::zp_net_ThreadPool::evt_BroadcastData);
disconnect (pClientNode,&st_clientNode::evt_close_client,m_pThreadPool,&ZPNetwork::zp_net_ThreadPool::KickClients);
disconnect (pClientNode,&st_clientNode::evt_Message,this,&st_client_table::evt_Message);
m_nodeToBeDel.push_back(pClientNode);
//qDebug()<<QString("%1(ref %2) Node Push in queue.\n").arg((unsigned int)pClientNode).arg(pClientNode->ref());
......@@ -123,6 +123,7 @@ void st_client_table::on_evt_Data_recieved(QObject * clientHandle,const QByteA
connect (pnode,&st_clientNode::evt_SendDataToClient,m_pThreadPool,&ZPNetwork::zp_net_ThreadPool::SendDataToClient,Qt::QueuedConnection);
connect (pnode,&st_clientNode::evt_BroadcastData,m_pThreadPool,&ZPNetwork::zp_net_ThreadPool::evt_BroadcastData,Qt::QueuedConnection);
connect (pnode,&st_clientNode::evt_close_client,m_pThreadPool,&ZPNetwork::zp_net_ThreadPool::KickClients,Qt::QueuedConnection);
connect (pnode,&st_clientNode::evt_Message,this,&st_client_table::evt_Message,Qt::QueuedConnection);
m_hash_sock2node[clientHandle] = pnode;
nHashContains = true;
pClientNode = pnode;
......
......@@ -29,6 +29,7 @@ protected:
ZPNetwork::zp_net_ThreadPool * m_pThreadPool;
ZPTaskEngine::zp_pipeline * m_pTaskEngine;
signals:
void evt_Message (const QString &);
public slots:
//this event indicates new client connected.
......
......@@ -11,6 +11,7 @@ st_clientNode::st_clientNode(st_client_table * pClientTable, QObject * pClientSo
m_uuid = 0xffffffff;//Not Valid
m_pClientTable = pClientTable;
bTermSet = false;
m_last_Report = QDateTime::currentDateTime();
}
//The main functional method, will run in thread pool
......@@ -70,90 +71,138 @@ int st_clientNode::push_new_data(const QByteArray & dtarray)
m_list_RawData.push_back(dtarray);
res = m_list_RawData.size();
m_mutex.unlock();
m_last_Report = QDateTime::currentDateTime();
return res;
}
//!deal one message, affect m_currentRedOffset,m_currentMessageSize,m_currentHeader
//!return bytes Used.
int st_clientNode::filter_message(const QByteArray & block, int offset)
{
while (block.length()>offset)
const int blocklen = block.length();
while (blocklen>offset)
{
const char * dataptr = block.constData();
while (m_currentMessageSize< sizeof(SMARTLINK_MSG)-1)
//Recieve First 2 byte
while (m_currentMessageSize<2 && blocklen>offset )
{
m_currentBlock.push_back(dataptr[offset++]);
m_currentMessageSize++;
if (offset >= block.length())
break;
}
if (m_currentMessageSize < sizeof(SMARTLINK_MSG)-1) //Header not completed.
if (m_currentMessageSize < 2) //First 2 byte not complete
continue;
else if (m_currentMessageSize == sizeof(SMARTLINK_MSG)-1)//Header just completed.
if (m_currentMessageSize==2)
{
const char * headerptr = m_currentBlock.constData();
memcpy((void *)&m_currentHeader,headerptr,sizeof(SMARTLINK_MSG)-1);
memcpy((void *)&m_currentHeader,headerptr,2);
}
//continue reading if there is data left behind
if (block.length()>offset)
const char * ptrCurrData = m_currentBlock.constData();
//Heart Beating
if (m_currentHeader.Mark == 0xBEBE)
{
while (m_currentMessageSize< sizeof(SMARTLINK_HEARTBEATING) && blocklen>offset )
{
qint32 bitLeft = m_currentHeader.data_length + sizeof(SMARTLINK_MSG) - 1
-m_currentMessageSize ;
while (bitLeft>0 && block.length()>offset)
m_currentBlock.push_back(dataptr[offset++]);
m_currentMessageSize++;
}
if (m_currentMessageSize < sizeof(SMARTLINK_HEARTBEATING)) //Header not completed.
continue;
//Send back
emit evt_SendDataToClient(this->sock(),m_currentBlock);
//This Message is Over. Start a new one.
m_currentMessageSize = 0;
m_currentBlock = QByteArray();
continue;
}
else if (m_currentHeader.Mark == 0x55AA)
//Trans Message
{
while (m_currentMessageSize< sizeof(SMARTLINK_MSG)-1 && blocklen>offset)
{
m_currentBlock.push_back(dataptr[offset++]);
m_currentMessageSize++;
}
if (m_currentMessageSize < sizeof(SMARTLINK_MSG)-1) //Header not completed.
continue;
else if (m_currentMessageSize == sizeof(SMARTLINK_MSG)-1)//Header just completed.
{
const char * headerptr = m_currentBlock.constData();
memcpy((void *)&m_currentHeader,headerptr,sizeof(SMARTLINK_MSG)-1);
//continue reading if there is data left behind
if (block.length()>offset)
{
m_currentBlock.push_back(dataptr[offset++]);
m_currentMessageSize++;
bitLeft--;
}
if (m_currentHeader.Mark==0x55AA )
qint32 bitLeft = m_currentHeader.data_length + sizeof(SMARTLINK_MSG) - 1
-m_currentMessageSize ;
while (bitLeft>0 && blocklen>offset)
{
m_currentBlock.push_back(dataptr[offset++]);
m_currentMessageSize++;
bitLeft--;
}
//deal block, may be send data as soon as possible;
deal_current_message_block();
else //Bad MSG!
{
emit evt_close_client(this->sock());
}
if (bitLeft>0)
if (bitLeft>0)
continue;
//This Message is Over. Start a new one.
m_currentMessageSize = 0;
m_currentBlock = QByteArray();
continue;
//This Message is Over. Start a new one.
m_currentMessageSize = 0;
m_currentBlock.clear();
continue;
}
}
}
else
{
if (block.length()>offset)
else
{
qint32 bitLeft = m_currentHeader.data_length + sizeof(SMARTLINK_MSG) - 1
-m_currentMessageSize ;
while (bitLeft>0 && block.length()>offset)
if (block.length()>offset)
{
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)
qint32 bitLeft = m_currentHeader.data_length + sizeof(SMARTLINK_MSG) - 1
-m_currentMessageSize ;
while (bitLeft>0 && blocklen>offset)
{
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;
//This Message is Over. Start a new one.
m_currentMessageSize = 0;
m_currentBlock.clear();
continue;
}
}
}
} // end if there is more bytes to append
} //end deal trans message
else
{
emit evt_Message(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 current message
int st_clientNode::deal_current_message_block()
{
//First, get uuid as soon as possible
if (m_bUUIDRecieved==false)
{
if (m_currentHeader.source_id!=0xffffffff)
if (m_currentHeader.source_id>= 0x00010000 && m_currentHeader.source_id <= 0x0FFFFFFF )
{
m_bUUIDRecieved = true;
m_uuid = m_currentHeader.source_id;
//regisit client node to hash-table;
m_pClientTable->regisitClientUUID(this);
}
else if (m_currentHeader.source_id>= (unsigned int)0x80000000 && m_currentHeader.source_id <= (unsigned int)0xAFFFFFFF )
{
m_bUUIDRecieved = true;
m_uuid = m_currentHeader.source_id;
......@@ -161,25 +210,40 @@ int st_clientNode::deal_current_message_block()
m_pClientTable->regisitClientUUID(this);
}
else //Invalid
{
emit evt_Message(tr("Client ID is invalid! Close client immediatly."));
m_currentBlock = QByteArray();
emit evt_close_client(this->sock());
return 0;
}
}
//then , Start deal to-server messages
if (m_currentHeader.destin_id==0xffffffff)
//Server - deal messages
if (m_currentHeader.destin_id==0x00000001)
{
//need furture works.
if (m_currentHeader.data_length==0) //heart-beating
{
emit evt_SendDataToClient(this->sock(),m_currentBlock);
m_currentBlock.clear();
}
else
{
//Do Nothing
m_currentBlock.clear();
}
//Do Nothing
m_currentBlock = QByteArray();
emit evt_Message(tr("To-server Message is not currently supported."));
}
//deal Broadcast messages
else if (m_currentHeader.destin_id==0xFFFFFFFC)
{
//need furture works.
//Do Nothing
emit evt_Message(tr("Broadcast Message is not currently supported."));
m_currentBlock = QByteArray();
}
else if (m_currentHeader.destin_id==0xFFFFFFFD)
{
//need furture works.
//Do Nothing
emit evt_Message(tr("Broadcast Message is not currently supported."));
m_currentBlock = QByteArray();
}
//deal client-to-client messages
else
{
//find Destin Client using Hash.
......@@ -189,13 +253,14 @@ int st_clientNode::deal_current_message_block()
//need further dev, insert into db, or catched on disk.
//destin client is un-reachable, or in another function server.
//need server-to-server channels to re-post this message.
qDebug()<<"Destin ID "<<m_currentHeader.destin_id<< "is not valid\n";
emit evt_Message(tr("Destin ID ") + QString("%1").arg(m_currentHeader.destin_id) + tr(" is not currently logged in.\n"));
//Do Nothing
}
else
{
emit evt_SendDataToClient(destin_node->sock(),m_currentBlock);
m_currentBlock.clear();
m_currentBlock = QByteArray();
}
}
......
......@@ -4,6 +4,7 @@
#include <QObject>
#include <QList>
#include <QMutex>
#include <QDateTime>
#include "st_message.h"
#include "../pipeline/zp_pltaskbase.h"
namespace SmartLink{
......@@ -28,6 +29,12 @@ public:
QObject * sock() {return m_pClientSock;}
bool uuidValid(){return m_bUUIDRecieved;}
bool bTermSet;
QDateTime lastActiveTime()
{
return m_last_Report;
}
protected:
//!deal one message, affect m_currentRedOffset,m_currentMessageSize,m_currentHeader
//!return bytes Used.
......@@ -57,10 +64,14 @@ protected:
st_client_table * m_pClientTable;
QDateTime m_last_Report;
signals:
void evt_SendDataToClient(QObject * objClient,const QByteArray & dtarray);
void evt_BroadcastData(QObject * objFromClient,const QByteArray & dtarray);
void evt_close_client(QObject * objClient);
void evt_Message (const QString &);
};
}
......
......@@ -17,6 +17,11 @@ typedef struct tag_smartlink_message{
__UINT16_TYPE__ Reserved2;
__UINT8_TYPE__ data[1];
} SMARTLINK_MSG;
typedef struct tag_smartlink_heartBeating
{
__UINT16_TYPE__ Mark; //Always be 0xBeBe
__UINT16_TYPE__ tmStamp;
} SMARTLINK_HEARTBEATING;
#endif
#if defined(_MSC_VER)
......@@ -32,6 +37,11 @@ typedef struct tag_smartlink_message{
unsigned __int16 Reserved2;
unsigned __int8 data[1];
} SMARTLINK_MSG;
typedef struct tag_smartlink_heartBeating
{
unsigned __int16 Mark; //Always be 0xBeBe
unsigned __int16 tmStamp;
} SMARTLINK_HEARTBEATING;
#endif
......
......@@ -24,7 +24,7 @@ ZPMainFrame::ZPMainFrame(QWidget *parent) :
m_taskEngine = new zp_pipeline(this);
//Create Smartlink client table
m_clientTable = new SmartLink::st_client_table (m_netEngine,m_taskEngine,this);
connect (m_clientTable,&SmartLink::st_client_table::evt_Message,this,&ZPMainFrame::on_evt_Message);
//Create databases
m_pDatabases = new ZPDatabase::DatabaseResource(this);
connect (m_pDatabases,&ZPDatabase::DatabaseResource::evt_Message,this,&ZPMainFrame::on_evt_Message);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册