public unsafe void SetPacketType(ushort type) { fixed(byte *ptr = buffer) { PacketHeader *hdr = (PacketHeader *)(ptr); hdr->Type = type; } }
public unsafe void SetChecksum(ushort checksum) { fixed(byte *ptr = buffer) { PacketHeader *hdr = (PacketHeader *)(ptr); hdr->Checksum = checksum; } }
private unsafe void SetPacketSize(ushort size) { fixed(byte *ptr = buffer) { PacketHeader *hdr = (PacketHeader *)(ptr); hdr->Size = size; } }
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); } }
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; } } }
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); }