Example #1
0
NET_ERROR_CODE TcpNetwork::RecvBufferProcess(const int sessionIndex)
{
	auto& session = m_ClientSessionPool[sessionIndex];
	auto readPos = 0;

	const auto dataSize = session.RemainingDataSize;
	Packet::PktHeader* pPktHeader;

	while ((dataSize - readPos) >= ServerConfig::PACKET_HEADER_SIZE)
	{
		pPktHeader = (Packet::PktHeader*)&session.pRecvBuffer[readPos];
		readPos += ServerConfig::PACKET_HEADER_SIZE;

		if (pPktHeader->BodySize > 0)
		{
			if (pPktHeader->BodySize > (dataSize - readPos))
			{
				readPos -= ServerConfig::PACKET_HEADER_SIZE;
				break;
			}
			if (pPktHeader->BodySize > ServerConfig::MAX_PACKET_SIZE)
			{
				break;
			}
		}
		AddPacketQueue(sessionIndex, pPktHeader->Id, pPktHeader->BodySize, &session.pRecvBuffer[readPos]);
		readPos += pPktHeader->BodySize;
	}
	session.RemainingDataSize -= readPos;
	m_BeforeReadPos = readPos;

	return NET_ERROR_CODE::NONE;
}
	NET_ERROR_CODE TCPNetwork::ReceiveBufferProcess(const int sessionIdx)
	{ //분석해보기!
		auto& cs = m_clientSessionPool[sessionIdx];

		auto readPos = 0;
		auto dataSize = cs.RemainingDataSize;
		PacketHeader* pPktHeader;

		while ((dataSize - readPos) >= PACKET_HEADER_SIZE)
		{
			pPktHeader = (PacketHeader*)&cs.pRecvBuffer[readPos];
			readPos += PACKET_HEADER_SIZE;

			if (pPktHeader->BodySize > 0)
			{
				if (pPktHeader->BodySize < (dataSize - readPos))
				{
					break;
				}

				if (pPktHeader->BodySize > MAX_PACKET_SIZE)
				{
					return NET_ERROR_CODE::RECV_CLIENT_MAX_PACKET;
				}
			}

			AddPacketQueue(sessionIdx, pPktHeader->Id, pPktHeader->BodySize, (cs.pRecvBuffer + readPos));

			readPos += pPktHeader->BodySize;
		}
	}
	ServerNetwork::NETWORK_ERROR_CODE TcpNetwork::RecvBufferProcess(const int sessionIndex)
	{
		auto& session = m_ClientSessionPool[sessionIndex];

		auto readPos = 0;
		const auto dataSize = session.RemainingDataSize;
		PacketHeader* pPktHeader;

		while ((dataSize - readPos) >= PACKET_HEADER_SIZE)
		{
			pPktHeader = (PacketHeader*)&session.pRecvBuffer[readPos];
			readPos += PACKET_HEADER_SIZE;

			if (pPktHeader->BodySize > 0)
			{
				if (pPktHeader->BodySize < (dataSize - readPos))
				{
					//added
					readPos -= PACKET_HEADER_SIZE;
					break;
				}

				if (pPktHeader->BodySize > MAX_PACKET_SIZE)
				{
					return NETWORK_ERROR_CODE::RECV_CLIENT_MAX_PACKET;
				}
			}

			AddPacketQueue(sessionIndex, pPktHeader->Id, pPktHeader->BodySize, &session.pRecvBuffer[readPos]);

			readPos += pPktHeader->BodySize;
		}

		session.RemainingDataSize -= readPos;

		if (session.RemainingDataSize > 0)
		{
			memcpy(session.pRecvBuffer, &session.pRecvBuffer[readPos], session.RemainingDataSize);
		}

		return NETWORK_ERROR_CODE::NONE;
	}
	void TcpNetwork::CloseSession(const SOCKET_CLOSE_CASE closeCase, const SOCKET sockFD, const int sessionIndex)
	{
		if (closeCase == SOCKET_CLOSE_CASE::SESSION_POOL_EMPTY)
		{
			closesocket(sockFD);
			FD_CLR(sockFD, &m_Readfds);
			return;
		}

		if (m_ClientSessionPool[sessionIndex].IsConnected() == false) {
			return;
		}

		closesocket(sockFD);
		FD_CLR(sockFD, &m_Readfds);

		m_ClientSessionPool[sessionIndex].Clear();
		--m_ConnectedSessionCount;
		ReleaseSessionIndex(sessionIndex);

		AddPacketQueue(sessionIndex, (short)PACKET_ID::NTF_SYS_CLOSE_SESSION, 0, nullptr);
	}