/////////////////////////////////////////////////////////////////////////////////////////////// // // SocketIO Class // /////////////////////////////////////////////////////////////////////////////////////////////// #include "SocketIO.h" #include #include SocketIO::SocketIO(void) : m_ServerState(ServerInfo::SS_SMOOTH), m_PacketCount(0), m_Crypt(CXORCrypt::GetInstance()) { Socket::InitWinsock(); } SocketIO::~SocketIO(void) { Socket::ReleaseWinsock(); } int SocketIO::Send(SOCKET Socket_In, WSABUF SendData_In) { int send_byte; send_byte = send(Socket_In, (char *)SendData_In.buf, SendData_In.len, 0); if(send_byte == SOCKET_ERROR || (int)SendData_In.len != send_byte) return 0; return send_byte; } int SocketIO::SendTo(SOCKET Socket_In, SOCKADDR_IN Addreess_In, WSABUF SendData_In) { int AddressSize = sizeof(SOCKADDR_IN); int send_byte = 0; send_byte = sendto(Socket_In, (char *)SendData_In.buf, SendData_In.len, 0, (struct sockaddr *)&Addreess_In, AddressSize); if(send_byte == SOCKET_ERROR || (int)SendData_In.len != send_byte) return 0; return send_byte; } int SocketIO::Recv(SOCKET Socket_In, WSABUF &RecvData_In) { DWORD recv_byte; if((recv_byte = recv(Socket_In, RecvData_In.buf, BufferSize, 0)) != SOCKET_ERROR) { RecvData_In.len = recv_byte; return recv_byte; } return 0; } int SocketIO::RecvFrom(SOCKET Socket_In, WSABUF &RecvData_In, LPSOCKADDR_IN Address_Out) { int AddressSize = sizeof(SOCKADDR_IN); DWORD recv_byte; if((recv_byte = recvfrom(Socket_In, RecvData_In.buf, BufferSize, 0, (struct sockaddr *)Address_Out, &AddressSize)) != SOCKET_ERROR) { RecvData_In.len = recv_byte; return recv_byte; } return 0; } int SocketIO::PutRecvBufferToPtBuffer(char *pBuffer_Out, int BufferSize_In, WSABUF &RecvData_In, char *RecvBuffer_In, unsigned short PageVer_In, unsigned char PageNum_In) { LPPktBase lpPktBase = NULL;; if(pBuffer_Out == NULL || RecvData_In.len == 0) return false; try { lpPktBase = (LPPktBase)RecvData_In.buf; if(lpPktBase->GetStartBit() != StartBit) { // ÆÐŶ ½ÃÀÛ ¾Æ´Ò °æ¿ì if(RecvData_In.buf != RecvBuffer_In) { // ÀÌÀü ÆÐŶ Á¸Àç ( ÆÐŶ ¿¬°á ) RecvData_In.len = static_cast((RecvData_In.buf - RecvBuffer_In) + RecvData_In.len); RecvData_In.buf = RecvBuffer_In; } else { // ÀÌÀü ÆÐŶ Á¸Àç ÇÏÁö ¾ÊÀ½ À߸øµÈ ÆÐŶ ( ¹öÆÛ ¸®¼Â ) RecvData_In.len = 0; RecvData_In.buf = RecvBuffer_In; return 0; } } lpPktBase = (LPPktBase)RecvData_In.buf; if(lpPktBase->GetStartBit() == StartBit) { // µðÄÚµù ÇØ´õ if(RecvData_In.len < PktBaseSize) { // À߸° ÆÐŶ Àü¼Û ( µ¥ÀÌÅÍ ¹öÆÛ Æ÷ÀÎÅÍ À̵¿ ) RecvData_In.buf = RecvData_In.buf + RecvData_In.len; RecvData_In.len = 0; return 0; } m_Crypt.DecodeHeader((char *)lpPktBase + 1, PktBaseSize - 1, PageVer_In, PageNum_In); unsigned short PacketLength = lpPktBase->GetLen(); if(PktMinLen <= PacketLength && PacketLength <= PktMaxLen) { // Á¤»ó ±æÀÌÀÇ ÆÐŶ if(PacketLength <= RecvData_In.len) { if(lpPktBase->IsCrypt()) { m_Crypt.DecodePacket((char *)lpPktBase + PktBaseSize, PacketLength - PktBaseSize, lpPktBase->GetCodePage()); } if(lpPktBase->IsCompress()) { // ¾ÐÃà ÆÐŶ ó¸® DWORD Len = BufferSize_In; CopyMemory(pBuffer_Out, (char *)lpPktBase, PktBaseSize); CMiniLZOCompress::Decompress((char *)lpPktBase + PktBaseSize, PacketLength - PktBaseSize, pBuffer_Out + PktBaseSize, &Len); lpPktBase->SetLen((unsigned short)Len + PktBaseSize); } else { // ºñ ¾ÐÃà ÆÐŶ ó¸® CopyMemory(pBuffer_Out, (char *)lpPktBase, PacketLength); } RecvData_In.len = RecvData_In.len - PacketLength; if(RecvData_In.len) { // ¹ÞÀº µ¥ÀÌÅͰ¡ ³²¾ÒÀ» °æ¿ì CopyMemory((char *)lpPktBase, (char *)lpPktBase + PacketLength, RecvData_In.len); } return PacketLength; } else { m_Crypt.EncodeHeader((char *)lpPktBase + 1, PktBaseSize - 1, PageVer_In, PageNum_In); // À߸° ÆÐŶ Àü¼Û ( µ¥ÀÌÅÍ ¹öÆÛ Æ÷ÀÎÅÍ À̵¿ ) RecvData_In.buf = RecvData_In.buf + RecvData_In.len; RecvData_In.len = 0; return 0; } } else { // ºñÁ¤»óÀû ±æÀÌÀÇ ÆÐŶ RecvData_In.buf = RecvBuffer_In; RecvData_In.len = 0; return 0; } } else { // À߸øµÈ ÆÐŶ ( ¹öÆÛ ¸®¼Â ) RecvData_In.buf = RecvBuffer_In; RecvData_In.len = 0; return 0; } } catch(...) { return 0; } return 0; }