Initial commit
This commit is contained in:
@@ -0,0 +1,192 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user