#ifdef _WIN32 #include //#include #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; }