Files
DBService/ComposeService/MessageThread.cpp
T
2026-07-09 11:27:59 +08:00

193 lines
4.2 KiB
C++

#ifdef _WIN32
#include <windows.h>
//#include <process.h>
#endif
#include "debug.h"
#include "MessageThread.h"
#include "MessageHandle.h"
MHTHREADLIST g_lstMessageHandleThreads;
////////////////////////////////////////////////////////////////////////////
//
// CUDPMessageReceiveThread
//
CUDPMessageReceiveThread::CUDPMessageReceiveThread(unsigned int nStackSize, CUDPSocket * pSocket)
:CThread(nStackSize)
{
m_pSocket = pSocket;
}
void CUDPMessageReceiveThread::Main()
{
TNETMESSAGE * pMsg = NULL;
while (!m_bExit && m_pSocket ){
unsigned int nIpAddr;
unsigned short nPort;
pMsg = ReadMessage( nIpAddr, nPort );
if( pMsg ){
MHTHREADLIST::iterator iMT;
for( iMT=g_lstMessageHandleThreads.begin(); iMT!=g_lstMessageHandleThreads.end(); iMT++ ){
CMessageHandleThread * pThread = *iMT;
if( pThread->IsSuspended() ){
pThread->SetPeerAddress( nIpAddr, nPort );
pThread->SetRequestMsg( pMsg );
pThread->Resume();
break;
}
}
if(iMT==g_lstMessageHandleThreads.end()){ //无空闲线程
delete pMsg;
}
}
}
DebugPrint("退出网络消息接收线程");
ExitThread();
}
void CUDPMessageReceiveThread::Terminate()
{
CThread::Terminate();
if( m_pSocket ){
m_pSocket->Close();
delete m_pSocket;
m_pSocket = NULL;
}
if(GetThreadID() && IsSuspended())
Resume();
// Sleep( 10 );
}
TNETMESSAGE * CUDPMessageReceiveThread::ReadMessage(unsigned int &nIpAddr,unsigned short &nPort)
{
int ret = m_pSocket->ReadFrom( m_sBuf, MAX_UDP_PACKET_SIZE, nIpAddr, nPort );
if( ret==SOCKET_ERROR ){
int err = WSAGetLastError();
DebugPrint("读取网络消息失败:错误号 %d", err);
}
else if( ret==0 ){
DebugPrint("网络连接已关闭");
}
else if(ValidNetMessage((UCHAR*)m_sBuf, ret)){
TNETMESSAGE * pMsg = new TNETMESSAGE;
if( ReadNetMessage( (unsigned char*)m_sBuf, ret, pMsg ) ){
return pMsg;
}
else{
delete pMsg;
}
}
return NULL;
}
////////////////////////////////////////////////////////////////////////////
//
// CMessageHandleThread
//
CMessageHandleThread::CMessageHandleThread(unsigned int nStackSize, CUDPSocket * pSocket)
:CThread(nStackSize)
{
m_pSocket = pSocket;
m_pRequestMsg = NULL;
m_nPeerIp = 0;
m_nPeerPort = 0;
}
void CMessageHandleThread::Main()
{
while (!m_bExit && m_pSocket){
if( m_pRequestMsg ){
bool bIngnore = false;
if(m_pRequestMsg->eMessageType!=e_connectRequest || m_pRequestMsg->iExtra>=0x0B00) //之前版本连接UDP可能有问题
HandleGerneralMessage();
delete m_pRequestMsg;
m_pRequestMsg = NULL;
}
Suspend();
}
DebugPrint("退出消息处理线程");
ExitThread();
}
void CMessageHandleThread::HandleGerneralMessage()
{
TNETMESSAGE msgResponse;
if(m_pRequestMsg->iExtra < 0x0D00){
memcpy(m_pRequestMsg->idDevice, &m_nPeerIp, 4);
memcpy(m_pRequestMsg->idDevice+4, &m_nPeerPort, 2);
}
else{
memcpy(msgResponse.idDevice, m_pRequestMsg->idDevice, 6);
}
if( HandleRequest( m_pRequestMsg, &msgResponse, m_nPeerIp, m_nPeerPort, true ) && !m_bExit){
int nRet = SendMessage( &msgResponse );
}
}
void CMessageHandleThread::HandleUpdateMessage()
{
}
void CMessageHandleThread::HandleUploadMessage()
{
}
void CMessageHandleThread::Terminate()
{
CThread::Terminate();
// if( m_pSocket ){
// m_pSocket->Close();
// delete m_pSocket;
// m_pSocket = NULL;
// }
if(GetThreadID() && IsSuspended())
Resume();
// Sleep( 10 );
}
int CMessageHandleThread::SendMessage( TNETMESSAGE *pMsg )
{
char cMsg[MAX_MSG_LENGTH];
short nSize = MAX_MSG_LENGTH;
if( !WriteNetMessage( (unsigned char*)cMsg, nSize, pMsg ) ){
return 0;
}
//发送数据
int nSend = m_pSocket->SendTo( cMsg, nSize, m_nPeerIp, m_nPeerPort );
// if( nSend==pMsg->nLength+10 ){
// char *pb=(char *)&(m_nPeerIp);
// unsigned b1=(unsigned char)(*pb);
// unsigned b2=(unsigned char)(*(pb+1));
// unsigned b3=(unsigned char)(*(pb+2));
// unsigned b4=(unsigned char)(*(pb+3));
// DebugPrint( "发送UDP消息到 %d.%d.%d.%d:%d 成功", b1, b2, b3, b4, m_nPeerPort );
// }
return nSend;
}