diff --git a/src/EterLib/NetStream.cpp b/src/EterLib/NetStream.cpp index a18b372..1041060 100644 --- a/src/EterLib/NetStream.cpp +++ b/src/EterLib/NetStream.cpp @@ -1,12 +1,15 @@ #include "StdAfx.h" #include "NetStream.h" //#include "eterCrypt.h" +#include #ifndef _IMPROVED_PACKET_ENCRYPTION_ #include "EterBase/tea.h" #endif -//#define _PACKETDUMP +#ifdef _DEBUG +#define _PACKETDUMP +#endif #ifndef _IMPROVED_PACKET_ENCRYPTION_ void CNetworkStream::SetSecurityMode(bool isSecurityMode, const char* c_szTeaKey) @@ -721,25 +724,37 @@ bool CNetworkStream::Recv(int size) return true; } +static std::string dump_hex(const uint8_t* ptr, const std::size_t length) +{ + if (!ptr || !length) + return {}; + + std::stringstream ss; + + std::vector buffer(length); + memcpy(&buffer[0], ptr, length); + + for (size_t i = 0; i < length; ++i) + ss << std::hex << std::setfill('0') << std::setw(2) << (int)buffer.at(i) << ", "; + + const auto str = ss.str(); + return str.substr(0, str.size() - 2); +} + bool CNetworkStream::Recv(int size, char * pDestBuf) { if (!Peek(size, pDestBuf)) return false; #ifdef _PACKETDUMP - if (*pDestBuf != 0 ) + if (*pDestBuf != 0) { - TraceError("RECV< %s (%d)", GetRecvHeaderName(*pDestBuf), size); - std::string contents; - char buf[10]; - for(int i = 1; i < size; i++) - { - sprintf(buf," %02x", (unsigned char)(pDestBuf[i])); - contents.append(buf); - } - TraceError(contents.c_str()); + const auto kHeader = *pDestBuf; + TraceError("RECV< %s %u(0x%X) (%d)", GetRecvHeaderName(kHeader), kHeader, kHeader, size); + + const auto contents = dump_hex(reinterpret_cast(pDestBuf), size); + TraceError("%s", contents.c_str()); } - #endif m_recvBufOutputPos += size; @@ -762,18 +777,13 @@ bool CNetworkStream::Send(int size, const char * pSrcBuf) m_sendBufInputPos += size; #ifdef _PACKETDUMP - if (*pSrcBuf != 0 ) + if (*pSrcBuf != 0) { - TraceError("SEND> %s (%d)", GetSendHeaderName(*pSrcBuf), size); - std::string contents; - char buf[10]; - for(int i = 1; i < size; i++) - { - sprintf(buf," %02x", (unsigned char)(pSrcBuf[i])); - contents.append(buf); - } - TraceError(contents.c_str()); + const auto kHeader = *pSrcBuf; + TraceError("SEND> %s %u(0x%X) (%d)", GetRecvHeaderName(kHeader), kHeader, kHeader, size); + const auto contents = dump_hex(reinterpret_cast(pSrcBuf), size); + TraceError("%s", contents.c_str()); } #endif diff --git a/src/UserInterface/PythonNetworkStream.cpp b/src/UserInterface/PythonNetworkStream.cpp index aa04661..d87b6a8 100644 --- a/src/UserInterface/PythonNetworkStream.cpp +++ b/src/UserInterface/PythonNetworkStream.cpp @@ -182,7 +182,7 @@ class CMainPacketHeaderMap : public CNetworkPacketHeaderMap } }; -int g_iLastPacket[2] = { 0, 0 }; +static std::vector gs_vecLastHeaders; void CPythonNetworkStream::ExitApplication() { @@ -526,7 +526,10 @@ bool CPythonNetworkStream::CheckPacket(TPacketHeader * pRetHeader) if (!s_packetHeaderMap.Get(header, &PacketType)) { - TraceError("Unknown packet header: %d, last: %d %d", header, g_iLastPacket[0], g_iLastPacket[1]); + TraceError("Unknown packet header: %u(0x%X), Phase: %s, Last packets:", header, header, m_strPhase.c_str()); + for (const auto& it : gs_vecLastHeaders) + TraceError("%u(0x%X)", it, it); + ClearRecvBuffer(); PostQuitMessage(0); @@ -553,11 +556,15 @@ bool CPythonNetworkStream::CheckPacket(TPacketHeader * pRetHeader) { if (!Peek(PacketType.iPacketSize)) { - TraceError("Not enough packet size: header %d packet size: %d, recv buffer size: %d (last: %d %d)", + TraceError("Not enough packet size: header %d packet size: %d, recv buffer size: %d last packets:", header, PacketType.iPacketSize, - GetRecvBufferSize(), - g_iLastPacket[0], g_iLastPacket[1]); + GetRecvBufferSize() + ); + + for (const auto& it : gs_vecLastHeaders) + TraceError("%u(0x%X)", it, it); + return false; } } @@ -567,8 +574,12 @@ bool CPythonNetworkStream::CheckPacket(TPacketHeader * pRetHeader) *pRetHeader = header; - g_iLastPacket[0] = g_iLastPacket[1]; - g_iLastPacket[1] = header; + // Add to last headers, if last header is contain more than 10 headers, remove first header + if (gs_vecLastHeaders.size() > 10) + gs_vecLastHeaders.erase(gs_vecLastHeaders.begin()); + + gs_vecLastHeaders.push_back(header); + //Tracenf("header %d size %d", header, PacketType.iPacketSize); //Tracenf("header %d size %d outputpos[%d] security %u", header, PacketType.iPacketSize, m_recvBufOutputPos, IsSecurityMode()); return true; @@ -576,8 +587,9 @@ bool CPythonNetworkStream::CheckPacket(TPacketHeader * pRetHeader) bool CPythonNetworkStream::RecvErrorPacket(int header) { - TraceError("Phase %s does not handle this header (header: %d, last: %d, %d)", - m_strPhase.c_str(), header, g_iLastPacket[0], g_iLastPacket[1]); + TraceError("Phase %s does not handle this header (header: %u(0x%X)) Last packets: ", m_strPhase.c_str(), header); + for (const auto& it : gs_vecLastHeaders) + TraceError("%u(0x%X)", it, it); ClearRecvBuffer(); return true;