193 lines
4.2 KiB
C++
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;
|
|
}
|