Example #1
0
        public unsafe void SetPacketType(ushort type)
        {
            fixed(byte *ptr = buffer)
            {
                PacketHeader *hdr = (PacketHeader *)(ptr);

                hdr->Type = type;
            }
        }
Example #2
0
        public unsafe void SetChecksum(ushort checksum)
        {
            fixed(byte *ptr = buffer)
            {
                PacketHeader *hdr = (PacketHeader *)(ptr);

                hdr->Checksum = checksum;
            }
        }
Example #3
0
        private unsafe void SetPacketSize(ushort size)
        {
            fixed(byte *ptr = buffer)
            {
                PacketHeader *hdr = (PacketHeader *)(ptr);

                hdr->Size = size;
            }
        }
Example #4
0
        private unsafe void UpdateSize(ushort size)
        {
            index += size;

            fixed(byte *ptr = buffer)
            {
                PacketHeader *pkt = (PacketHeader *)(ptr);
                DataHeader *  dt  = (DataHeader *)(ptr + HEADER_SIZE);

                dt->DataSize += size;
                pkt->Size     = (ushort)(HEADER_SIZE + dt->DataSize);
            }
        }
Example #5
0
        public override void Execute(GameClient Client, byte *pPacket)
        {
            PacketHeader *Header = (PacketHeader *)pPacket;

            if (Header->Type == 0x7EF)
            {
                NpcInitialize *Packet = (NpcInitialize *)pPacket;
                NpcScriptEngine.Initialize(Client, Packet->UID);
            }
            else
            {
                NpcDialog *Packet = (NpcDialog *)pPacket;
                if (Packet->OptionID != 255)
                {
                    string Input = new string(Packet->Input, 1, Packet->Input[0]);
                    NpcScriptEngine.Process(Client, Packet->OptionID, Input);
                }
                else
                {
                    Client.ActiveNPC = 0;
                }
            }
        }
Example #6
0
    void RecvCallback(IAsyncResult asyncResult)
    {
        if (isConnected == false)
        {
            return;
        }

        AsyncRecvData asyncRecvData = (AsyncRecvData)asyncResult.AsyncState;

        try
        {
            asyncRecvData.recvNum += asyncRecvData.socket.EndReceive(asyncResult);
            asyncRecvData.readPos  = 0;
        }
        catch (SocketException except)
        {
            ProcessException(except);
            return;
        }

        //성능 이슈로 포인터 기반으로 동작하게 고침
        #region make packet
        while (true)
        {
            if (asyncRecvData.recvNum < NetworkConstants.PACKET_HEADER_SIZE)
            {
                break;
            }

            unsafe
            {
                //패킷 헤더의 위치를 가리키는 포인터를 선언한다.
                fixed(byte *packetHeaderPos = &asyncRecvData.buffer[asyncRecvData.readPos])
                {
                    //해당 위치에서 PacketHeader를 읽는다
                    PacketHeader *packetHeader = (PacketHeader *)packetHeaderPos;

                    int packetSize = NetworkConstants.PACKET_HEADER_SIZE + packetHeader->bodySize;

                    if (asyncRecvData.recvNum < packetSize)
                    {
                        break;
                    }

                    Packet packet = new Packet();

                    packet.bodySize = packetHeader->bodySize;
                    packet.pktId    = packetHeader->pktId;

                    packet.data = NetworkConstants.ENCODING.GetString(
                        asyncRecvData.buffer,
                        asyncRecvData.readPos + NetworkConstants.PACKET_HEADER_SIZE,
                        packetHeader->bodySize);

                    lock (this)
                    {
                        packetQueue.Enqueue(packet);
                    }

                    asyncRecvData.readPos += packetSize;
                    asyncRecvData.recvNum -= packetSize;
                }
            }
        }
        #endregion

        #region shift remain bytes to front
        for (int i = 0; i < asyncRecvData.recvNum; i++)
        {
            asyncRecvData.buffer[i] = asyncRecvData.buffer[asyncRecvData.readPos + i];
        }
        #endregion

        asyncRecvData.socket.BeginReceive(
            asyncRecvData.buffer,
            asyncRecvData.recvNum,
            asyncRecvData.buffer.Length - asyncRecvData.recvNum,
            SocketFlags.None,
            recvCallback,
            asyncRecvData);
    }