PetePeter 36 Posted June 2, 2022 Share Posted June 2, 2022 (edited) Hi everyone, I'm not asking for help often as I try to debug everything by myself for my knowledge but I'm struggling with a bug and I don't understand the issue. Let's me explain everything in detail, maybe someone already this that and can at least give me some clues. As the title say I have a problem with a dynamic packet, but I have compare it multiple time with other one and i don't understand what can cause the bug. Let's me first explain what going on. Everytime this packet is sent to the client, the client is like frozen in time (The client still working, but it's like the connexion is lost with the server and no more packet are read) but i can unblock it by sending new packet (For example trying to ride the mount multiple time will make all previous packet to be read as normal) Now let's me show you all the code Serverside: // HEADER_GC_EVENT_MANAGER = 243 // EVENT_MANAGER_LOAD = 0 // tables.h typedef struct event_struct_ { WORD eventID; BYTE eventIndex; int startTime; int endTime; BYTE empireFlag; BYTE channelFlag; DWORD value[4]; bool eventStatus; bool eventTypeOnlyStart; } TEventManagerData; typedef struct event_packet_struct_ { BYTE dayIndex; TEventManagerData dayEventData; } TEventManagerDataPacket; typedef struct event_status_packet_struct_ { WORD eventID; bool eventStatus; int endTime; } TEventManagerDataStatusPacket; // packet.h typedef struct SPacketGCEventManager { BYTE header; BYTE subheader; WORD size; } TPacketGCEventManager; // char_manager.cpp void CHARACTER_MANAGER::CompareEventSendData(TEMP_BUFFER *buf) { for (auto it = m_eventData.begin(); it != m_eventData.end(); ++it) { if (it->second.size()) { TEventManagerDataPacket pDataPacket; pDataPacket.dayIndex = static_cast<BYTE>(it->first); for (DWORD j = 0; j < it->second.size(); ++j) { TEventManagerData pData = it->second[j]; pDataPacket.dayEventData = pData; buf->write(&pDataPacket, sizeof(pDataPacket)); } } } } void CHARACTER_MANAGER::SendDataPlayer(LPCHARACTER ch) { if (!ch->GetDesc()) return; TEMP_BUFFER buf; CompareEventSendData(&buf); TPacketGCEventManager p; p.header = HEADER_GC_EVENT_MANAGER; p.subheader = EVENT_MANAGER_LOAD; p.size = sizeof(p) + buf.size(); if (buf.size()) { ch->GetDesc()->BufferedPacket(&p, sizeof(p)); ch->GetDesc()->Packet(buf.read_peek(), buf.size()); } else { ch->GetDesc()->Packet(&p, sizeof(p)); } sys_log(0, "[EventManager] Send Data to Client. p.header: %d, p.subheader: %d, p.size: %d, buf.size: %d", p.header, p.subheader, p.size, buf.size()); } ClientSide: // Packet.h typedef struct SPacketGCEventManager { BYTE header; BYTE subheader; WORD size; } TPacketGCEventManager; typedef struct event_struct_ { WORD eventID; BYTE eventIndex; int startTime; int endTime; BYTE empireFlag; BYTE channelFlag; DWORD value[4]; bool eventStatus; bool eventTypeOnlyStart; }TEventManagerData; typedef struct event_packet_struct_ { BYTE dayIndex; TEventManagerData dayEventData; } TEventManagerDataPacket; typedef struct event_status_packet_struct_ { WORD eventID; bool eventStatus; int endTime; } TEventManagerDataStatusPacket; // PythonNetworkStream.cpp Set(HEADER_GC_EVENT_MANAGER, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCEventManager), DYNAMIC_SIZE_PACKET)); // PythonNetworkStreamPhaseGame.cpp bool CPythonNetworkStream::RecvEventManager() { Tracef(" RecvEventManager\n"); TPacketGCEventManager packet; if (!Recv(sizeof(TPacketGCEventManager), &packet)) return false; packet.size -= sizeof(packet); if (packet.subheader == EVENT_MANAGER_LOAD) { PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "ClearEventManager", Py_BuildValue("()")); while (packet.size > 0) { TEventManagerDataPacket pDataPacket; if (!Recv(sizeof(pDataPacket), &pDataPacket)) return false; const BYTE dayIndex = pDataPacket.dayIndex; const auto& eventPtr = pDataPacket.dayEventData; const time_t startTime = eventPtr.startTime; const time_t endTime = eventPtr.endTime; const struct tm vEventStartKey = *localtime(&startTime); const struct tm vEventEndKey = *localtime(&endTime); static char startTimeText[24]; static char endTimeText[24]; snprintf(startTimeText, sizeof(startTimeText), "%d-%02d-%02d %02d:%02d:%02d", vEventStartKey.tm_year + 1900, vEventStartKey.tm_mon + 1, vEventStartKey.tm_mday, vEventStartKey.tm_hour, vEventStartKey.tm_min, vEventStartKey.tm_sec); snprintf(endTimeText, sizeof(endTimeText), "%d-%02d-%02d %02d:%02d:%02d", vEventEndKey.tm_year + 1900, vEventEndKey.tm_mon + 1, vEventEndKey.tm_mday, vEventEndKey.tm_hour, vEventEndKey.tm_min, vEventEndKey.tm_sec); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "AppendEvent", Py_BuildValue("(iiissiiiiiiiii)", dayIndex, eventPtr.eventID, eventPtr.eventIndex, startTimeText, endTimeText, eventPtr.empireFlag, eventPtr.channelFlag, eventPtr.value[0], eventPtr.value[1], eventPtr.value[2], eventPtr.value[3], eventPtr.startTime, eventPtr.endTime, eventPtr.eventStatus)); packet.size -= sizeof(pDataPacket); } PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshEventManager", Py_BuildValue("()")); } else if (packet.subheader == EVENT_MANAGER_EVENT_STATUS) { TEventManagerDataStatusPacket pDataStatusPacket; if (!Recv(sizeof(pDataStatusPacket), &pDataStatusPacket)) return false; WORD eventID = pDataStatusPacket.eventID; bool eventStatus = pDataStatusPacket.eventStatus; int endTime = pDataStatusPacket.endTime; const time_t endTimeReal = endTime; const struct tm vEventEndKey = *localtime(&endTimeReal); char endTimeText[24]; snprintf(endTimeText, sizeof(endTimeText), "%d-%02d-%02d %02d:%02d:%02d", vEventEndKey.tm_year + 1900, vEventEndKey.tm_mon + 1, vEventEndKey.tm_mday, vEventEndKey.tm_hour, vEventEndKey.tm_min, vEventEndKey.tm_sec); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshEventStatus", Py_BuildValue("(iiis)", eventID, eventStatus, endTime, endTimeText)); } return true; } As you can see I added some debug points, here is the result when the function is called: Server: Jun 2 15:41:25 :: [EventManager] Send Data to Client. p.header: 243, p.subheader: 0, p.size: 84, buf.size: 80 Client: 0602 15:41:00437 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 115 packet size: 2381 0602 15:41:00440 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 115 packet size: 2381 0602 15:41:00451 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 115 packet size: 2381 0602 15:41:00468 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 115 packet size: 2381 [...] 0602 15:41:00501 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 4 packet size: 147 0602 15:41:00516 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 4 packet size: 122 [...] 0602 15:41:00615 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:41:00633 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:41:00649 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:41:00666 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:41:00682 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:41:00698 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:41:00715 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:41:00731 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:41:00748 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 [...] 0602 15:42:14872 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:42:14888 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:42:14905 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:42:14922 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:42:14937 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:42:14955 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:42:14971 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 21504 0602 15:42:14987 :: RecvEventManager All the "Not enough dynamic packet size" are spammed until I do the mount ride thing (as on the gif) and the "RecvEventManager" is called only at the end so it's can't be the function itself. I also notice than I got some other header with the error but it's only when this packet is sent, if I don't send this packet everything is normal and no error show. Thanks a lot if you can help me with that, i try to check everything and i really don't understand what can do that as I have a lot of the other dynamic packet who working perfectly. Edited August 16, 2022 by Metin2 Dev Core X - External 2 Internal Link to comment Share on other sites More sharing options...
Shang 371 Posted June 2, 2022 Share Posted June 2, 2022 When you declare the struct of a dynamic packet you should follow the primary struct which is this one: typedef struct packet_header_dynamic_size { BYTE header; WORD size; } TDynamicSizePacketHeader; The point is that you are declaring this: typedef struct SPacketGCEventManager { BYTE header; BYTE subheader; WORD size; } TPacketGCEventManager; and the correct one should be this: typedef struct SPacketGCEventManager { BYTE header; WORD size; BYTE subheader; } TPacketGCEventManager; You can corroborate this information in this function: bool CPythonNetworkStream::CheckPacket(TPacketHeader * pRetHeader) from UserInterface/PythonNetworkStream.cpp. 1 Link to comment Share on other sites More sharing options...
PetePeter 36 Posted June 2, 2022 Author Share Posted June 2, 2022 19 minutes ago, Shang said: When you declare the struct of a dynamic packet you should follow the primary struct which is this one: typedef struct packet_header_dynamic_size { BYTE header; WORD size; } TDynamicSizePacketHeader; The point is that you are declaring this: typedef struct SPacketGCEventManager { BYTE header; BYTE subheader; WORD size; } TPacketGCEventManager; and the correct one should be this: typedef struct SPacketGCEventManager { BYTE header; WORD size; BYTE subheader; } TPacketGCEventManager; You can corroborate this information in this function: bool CPythonNetworkStream::CheckPacket(TPacketHeader * pRetHeader) from UserInterface/PythonNetworkStream.cpp. Thanks a lot for the tip, i never noticed it before. I just did the change, but i have the exactly same bug right now just the packet size is different from log now 0602 16:56:03758 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 22133 0602 16:56:03774 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 22133 I'm gonna be crazy Link to comment Share on other sites More sharing options...
Premium WeedHex 636 Posted June 3, 2022 Premium Share Posted June 3, 2022 14 hours ago, PetePeter said: Thanks a lot for the tip, i never noticed it before. I just did the change, but i have the exactly same bug right now just the packet size is different from log now 0602 16:56:03758 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 22133 0602 16:56:03774 :: CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header 243 packet size: 22133 I'm gonna be crazy I'm gonna get crazy*. Ahahaha Jks apart, you didn't post the packet_info.cpp part. Link to comment Share on other sites More sharing options...
PetePeter 36 Posted June 3, 2022 Author Share Posted June 3, 2022 (edited) 1 hour ago, WeedHex said: I'm gonna get crazy*. Ahahaha Jks apart, you didn't post the packet_info.cpp part. Because packet_info.cpp is used for CG packet (Client to Game) and GG (Game to Game) but my issue is about GC packet (Game to Client) so have nothing in the packet_info.cpp Edited June 3, 2022 by PetePeter 1 Link to comment Share on other sites More sharing options...
Premium WeedHex 636 Posted June 3, 2022 Premium Share Posted June 3, 2022 (edited) On 6/3/2022 at 8:59 AM, PetePeter said: Because packet_info.cpp is used for CG packet (Client to Game) and GG (Game to Game) but my issue is about GC packet (Game to Client) so have nothing in the packet_info.cpp Ohh yep Edited June 9, 2023 by WeedHex Link to comment Share on other sites More sharing options...
PetePeter 36 Posted June 3, 2022 Author Share Posted June 3, 2022 3 hours ago, WeedHex said: Ohh yep sorry, I looked so fast and just wanted to put fast hints T_T Btw looking better I dont like how you managed on char_manager.cpp and in general the system, you could made it very smarter. I think every dev are different any way, and cleaning and optimise the code will come after debug phase. But thanks for your comment Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now