public override void Protocol(int packetID, CPacketStream packetStream) { switch(packetID) { case 256: // chat message temp packet id { int serial = packetStream.GetI32(); string msg = packetStream.GetString(); if (dig_list.Count > 100) dig_list.RemoveAt(0); string str = string.Format("{0} : {1}", serial, msg); dig_list.Add(str); form.RenewalMsg(this, str); } break; default: { Write("protocol(invalid packet id)"); } break; } }
public abstract void Protocol(int packetID, CPacketStream packetStream);
private void ReceiveCallBack(IAsyncResult ar) { try { int recvBytes = m_Sock.EndReceive(ar); if (recvBytes == 0) { Disconnect(); return; } Buffer.BlockCopy(m_recvBuffer, 0, m_saveBuffer, m_offset, recvBytes); m_offset += recvBytes; // 패킷 파싱 // 최소한 헤더사이즈만큼 받았는지 검사 while (m_offset >= SampleConstant.PACKET_HEADER_SIZE) { CPacketHeader header = new CPacketHeader(); header.size = BitConverter.ToUInt16(m_saveBuffer, 0); header.pid = BitConverter.ToUInt16(m_saveBuffer, 2); // 패킷 최대 크기 검사 int packetSize = header.size + SampleConstant.PACKET_HEADER_SIZE; if (packetSize > 4096) { Disconnect(); Write("Invalid Packet Size"); return; } // 패킷데이터 크기 검사 if (m_offset < packetSize) break; // 정상적인 패킷 CPacketStream packetStream = new CPacketStream(m_saveBuffer, SampleConstant.PACKET_HEADER_SIZE, packetSize - SampleConstant.PACKET_HEADER_SIZE); // 버퍼 리셋 Buffer.BlockCopy(m_saveBuffer, packetSize, m_saveBuffer, 0, m_offset - packetSize); m_offset -= packetSize; if (m_offset < 0) { Disconnect(); Write("Invalid Offset Position"); return; } Protocol(header.pid, packetStream); } // 패킷 수신 대기 상태로 전환 BeginAsyncReceive(); } catch (System.ObjectDisposedException ex) { Release(); Write(ex.ToString()); } catch (System.Exception ex) { Disconnect(); Write(ex.ToString()); } }