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); }