예제 #1
0
        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;
            }
        }
예제 #2
0
 public abstract void Protocol(int packetID, CPacketStream packetStream);
예제 #3
0
        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());
            }
        }