unsigned __stdcall ThreadFunction( void *pParam ) { IClient *pClient = ( IClient * )pParam; ASSERT( pClient ); while ( !m_theQuitThreadEvent.Wait( 0 ) ) { size_t dataLength = 0; const void *pData = pClient->GetPackFromServer( dataLength ); if ( !pData || 0 == dataLength ) { Sleep( 1 ); continue; } EXTEND_HEADER* pHeader = (EXTEND_HEADER*)pData; if (pHeader->ProtocolFamily == pf_relay) { if (pHeader->ProtocolID == relay_c2c_data) { RELAY_DATA* pRelayCmd = (RELAY_DATA*)pData; in_addr ia; ia.s_addr = pRelayCmd->nFromIP; cout << "relaydata: " << inet_ntoa(ia) << '(' << pRelayCmd->nFromRelayID << ')' << " -- recv size: " << dataLength << endl; } if (pHeader->ProtocolID == relay_s2c_loseway) { RELAY_DATA* pRelayCmd = (RELAY_DATA*)pData; in_addr ia; ia.s_addr = pRelayCmd->nFromIP; cout << "loseway: " << inet_ntoa(ia) << '(' << pRelayCmd->nFromRelayID << ')' << " -- recv size: " << dataLength << endl; } } } cout << "The read thread was killed safely!" << endl; m_theAfirmThreadQuitEvent.Set(); return 0; }