Jump to content

CPythonNetworkStream::CheckPacket - Not enough dynamic packet size


Recommended Posts

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)

spacer.png

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 by Metin2 Dev
Core X - External 2 Internal
Link to comment
Share on other sites

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.

  • Love 1
Link to comment
Share on other sites

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

  • Premium
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

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 by PetePeter
  • Good 1
Link to comment
Share on other sites

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

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

Announcements



×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.