Пример #1
0
        private void OnMessage <RequestPacket>(PacketHeader packetHeader, byte[] packetMessage)
            where RequestPacket : IServerPacket
        {
            //Header는 여기서 사용해야할까?
            //var requestPacket = MessagePackSerializer.Deserialize<dynamic>(packetMessage, MessagePack.Resolvers.ContractlessStandardResolver.Instance);

            //IServerPacket serverPacket = requestPacket as IServerPacket;

            var requestPacket = MessagePackSerializer.Typeless.Deserialize(packetMessage) as IServerPacket; //size 119

            //MessagePackSerializer.Deserialize<IServerPacket>(bytes);

            //여기에는 send로 온.. 데이터만 들어오는데..
            IClientPacket clientPacket = ProcessManager.Run(requestPacket.PacketId, requestPacket);

            byte[] bytes = MessagePack.MessagePackSerializer.Typeless.Serialize(clientPacket);

            PacketHeader packetHeader2 = new PacketHeader
            {
                ContentsVersion = packetHeader.ContentsVersion,
                LogicVersion    = packetHeader.LogicVersion,
                PacketID        = requestPacket.PacketId,
                PacketSize      = bytes.Length,
                EncriptKey      = 0,
                EncriptType     = 0,
            };

            //response
            IRequestItem requestItem = new PacketHolder(PacketHeaderConverter.CreateHeaderToBytes(packetHeader2), requestPacket.PacketId, bytes);

            Send(requestItem);
        }
Пример #2
0
        /// <summary>
        /// 소켓 버퍼로부터 데이터를 수신할 때 마다 호출된다.
        /// 데이터가 남아 있을 때 까지 계속 패킷을 만들어 callback을 호출 해 준다.
        /// 하나의 패킷을 완성하지 못했다면 버퍼에 보관해 놓은 뒤 다음 수신을 기다린다.
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="offset"></param>
        /// <param name="transffered"></param>
        public void OnReceive(byte[] buffer, int offset, int transffered, CompletedMessageCallback callback)
        {
            // 이번 receive로 읽어오게 될 바이트 수.
            remainBytes = transffered;

            // 원본 버퍼의 포지션값.
            // 패킷이 여러개 뭉쳐 올 경우 원본 버퍼의 포지션은 계속 앞으로 가야 하는데 그 처리를 위한 변수이다.
            int srcPosition = offset;

            // 남은 데이터가 있다면 계속 반복한다.
            while (remainBytes > 0)
            {
                bool         completed = false;
                PacketHeader header    = new PacketHeader();

                // 헤더만큼 못읽은 경우 헤더를 먼저 읽는다.
                if (currentPosition < PacketHeader.HEADER_SIZE)
                {
                    // 목표 지점 설정(헤더 위치까지 도달하도록 설정).
                    positionToRead = PacketHeader.HEADER_SIZE;

                    completed = ReadUntil(buffer, ref srcPosition, offset, transffered);

                    if (!completed)
                    {
                        // 아직 다 못읽었으므로 다음 receive를 기다린다.
                        return;
                    }

                    // 헤더 하나를 온전히 읽어왔으므로 메시지 사이즈를 구한다.
                    header      = PacketHeaderConverter.BytesToHeader(messageBuffer);
                    messageSize = header.PacketSize; //MessageSize(); //get_body_size();

                    // 다음 목표 지점(헤더 + 메시지 사이즈).
                    this.positionToRead = messageSize + PacketHeader.HEADER_SIZE;
                }

                // 메시지를 읽는다.
                completed = ReadUntil(buffer, ref srcPosition, offset, transffered);

                if (completed)
                {
                    // 패킷 하나를 완성 했다.
                    byte[] messagePacket = new byte[header.PacketSize];
                    Buffer.BlockCopy(messageBuffer, header.HeaderSize, messagePacket, 0, header.PacketSize);

                    callback(header, messagePacket);

                    clear_buffer();
                }
            }
        }
Пример #3
0
        public IRequestItem Request <RequestPacket>(RequestPacket requestPacket)
            where RequestPacket : IServerPacket
        {
            byte[] bytes = MessagePack.MessagePackSerializer.Typeless.Serialize(requestPacket);

            PacketHeader packetHeader = new PacketHeader
            {
                ContentsVersion = ContentsVersion,
                LogicVersion    = LogicVersion,
                PacketID        = requestPacket.PacketId,
                PacketSize      = bytes.Length,
                EncriptKey      = 0,
                EncriptType     = 0,
            };

            IRequestItem requestItem = new PacketHolder(PacketHeaderConverter.CreateHeaderToBytes(packetHeader), requestPacket.PacketId, bytes);

            return(requestItem);
        }