コード例 #1
0
 public void Enqueue(Packetinterface rowPacket)
 {
     lock (PacketQueue)
     {
         PacketQueue.Enqueue(rowPacket);
     }
 }
コード例 #2
0
ファイル: Network.cs プロジェクト: Kaiose/FinalProject
        public void receive()
        {
            if (stream_.DataAvailable)
            {
                Byte[] packetByte = new Byte[client_.ReceiveBufferSize];
                Int32  offset     = 0;
                Int32  readLen    = stream_.Read(packetByte, offset, packetByte.Length);

                PacketObfuscation.decodingHeader(ref packetByte, sizeof(Int32));

                Int32 packetLen = PacketUtil.decodePacketLen(packetByte, ref offset);


                while (readLen < packetLen)
                {
                    Byte[] remainPacket = new Byte[client_.ReceiveBufferSize];
                    Int32  remainLen    = 0;
                    remainLen = stream_.Read(remainPacket, 0, remainPacket.Length);
                    Buffer.BlockCopy(remainPacket, 0, packetByte, readLen, remainLen);
                    readLen += remainLen;
                }
                Byte[] packetData = new Byte[client_.ReceiveBufferSize];

                Buffer.BlockCopy(packetByte, offset, packetData, 0, readLen - offset);
                PacketObfuscation.decodingData(ref packetData, packetData.Length);
                Packetinterface rowPacket = PacketUtil.packetAnalyzer(packetData);

                if (rowPacket == null && this.isConnected())
                {
                    Debug.Log("잘못된 패킷이 수신되었습니다.");
                }

                ContentsProcee_.run(rowPacket);
            }
        }
コード例 #3
0
        // 로그인 과 채팅은 상관없는데 게임은함수포인터맵으로 바꾸는게 좋을듯함

        public override void run(Packetinterface packet)
        {
            PacketType type = (PacketType)packet.type();

            Debug.Log("받은 로그인 패킷" + type);


            switch (type)
            {
            case PacketType.E_S_ANS_ID_PW_FAIL:
                LoginPacketProcess.S_ANS_ID_PW_FAIL(packet);
                return;

            case PacketType.E_S_ANS_ID_PW_SUCCESS_CHATTING:
                LoginPacketProcess.S_ANS_ID_PW_FAIL(packet);
                return;

            case PacketType.E_S_ANS_ID_PW_SUCCESS_GAME:
                LoginPacketProcess.S_ANS_ID_PW_SUCCESS_GAME(packet);
                return;

            case PacketType.E_S_ANS_EXIT:
                return;
            }

            if (base.defaultRun(packet) == false)
            {
# if DEBUG
                Debug.Log("잘못된 패킷이 수신되었습니다. : ");
                Debug.Log(type);
#endif
            }
コード例 #4
0
ファイル: GamePacketProcess.cs プロジェクト: msk0609/OpenSoft
        public void S_ANS_MOVE(Packetinterface rowPacket)
        {
            PK_S_ANS_MOVE packet = (PK_S_ANS_MOVE)rowPacket;

            //GameManager.getInstance.MoveCharacter(packet.steering, packet.accel, packet.footbrake, packet.handbrake);

            GameManager.getInstance.MoveEnemy(packet.steering, packet.accel, packet.footbrake, packet.handbrake);
        }
コード例 #5
0
ファイル: GamePacketProcess.cs プロジェクト: msk0609/OpenSoft
        public void S_NOTIFY_CLIENT_DATA(Packetinterface rowPacket)
        {
            PK_S_NOTIFY_OTHER_CLIENT packet = (PK_S_NOTIFY_OTHER_CLIENT)rowPacket;

            Debug.Log("Recive S_NOTIFY_OTHER_CLIENT EnemyNumber : " + packet.userNumber.ToString());


            GameManager.getInstance.SetCharacterPostition(packet.userNumber, packet.pos_X, packet.pos_Y);
        }
コード例 #6
0
ファイル: GamePacketProcess.cs プロジェクト: msk0609/OpenSoft
        public void S_NOTIFY_USER_DATA(Packetinterface rowPacket)
        {
            PK_S_NOTIFY_USER_DATA packet = (PK_S_NOTIFY_USER_DATA)rowPacket;

            Debug.Log("Recive S_NOTIFY_USER_DATA");
            packet.userNumber = GameManager.getInstance.userCar;



            GameManager.getInstance.SetCharacterPostition(packet.userNumber, packet.pos_X, packet.pos_Y);
        }
コード例 #7
0
        public void S_ANS_ID_PW_SUCCESS_GAME(Packetinterface rowPacket)
        {
            PK_S_ANS_ID_PW_SUCCESS_GAME packet = (PK_S_ANS_ID_PW_SUCCESS_GAME)rowPacket;

            GameNetWork.getInstance.name_ = packet.name_;

            GameNetWork.getInstance.Open(packet.ip_, packet.port_);
            PK_C_REQ_REGIST_GAMING_CHARACTER_INFO retPacket = new PK_C_REQ_REGIST_GAMING_CHARACTER_INFO();

            retPacket.name_ = packet.name_;

            GameNetWork.getInstance.sendPacket(retPacket);

            SceneChange.getInstance.ChangeScene("RoomScene");
        }
コード例 #8
0
        public override void parse(Packetinterface packet)
        {
            PacketType type = (PacketType)packet.getType();

            Debug.Log("받은 게임 패킷 : " + type);

            switch (type)
            {
            case PacketType.E_S_ANS_EXIT:
                gamePacketProcess.S_ANS_EXIT(packet);
                return;

            case PacketType.E_S_ANS_CONNECT:
                gamePacketProcess.S_ANS_CONNECT(packet);
                return;

            case PacketType.E_S_NOTIFY_OTHER_CLIENT:
                gamePacketProcess.S_NOTIFY_CLIENT_DATA(packet);
                return;

            case PacketType.E_S_ANS_MOVE:
                gamePacketProcess.S_ANS_MOVE(packet);
                return;

            case PacketType.E_S_NOTIFY_USER_DATA:
                gamePacketProcess.S_NOTIFY_USER_DATA(packet);
                return;

            default:
                Debug.Log("잘못된 패킷이 수신되었습니다. : ");
                Debug.Log(type);
                break;
            }

            /*
             * if (base.defaultRun(packet) == false)
             * {
             #if DEBUG
             *  Debug.Log("잘못된 패킷이 수신되었습니다. : ");
             *  Debug.Log(type);
             #endif
             * }
             */
        }
コード例 #9
0
        public override void run(Packetinterface packet)
        {
            PacketType type = (PacketType)packet.type();

            Debug.Log("받은 게임 패킷 : " + type);

            switch (type)
            {
            case PacketType.E_S_ANS_GAME_EXIT:
                gamePacketProcess.S_ANS_EXIT(packet);
                return;
            }
            if (base.defaultRun(packet) == false)
            {
#if DEBUG
                Debug.Log("잘못된 패킷이 수신되었습니다 : ");
#endif
            }
        }
コード例 #10
0
ファイル: PacketUtil.cs プロジェクト: msk0609/OpenSoft
        public static Packetinterface packetAnalyzer(Byte[] packetByte, int totalOffset)
        {
            Int32 offset     = 0;
            Int32 packetType = PacketUtil.decodeInt32(packetByte, ref offset);

            Packetinterface packet = PacketFactory.getPacket(packetType);

            if (packet == null)
            {
                Debug.Log("packet Analyzer failed");
                return(null);
            }

            // 데이터가 있으면 decoding 해서 넘기기
            if (offset < totalOffset)
            {
                packet.decode(packetByte, ref offset);
            }
            return(packet);
        }
コード例 #11
0
ファイル: PacketUtil.cs プロジェクト: Kaiose/FinalProject
        public static Packetinterface packetAnalyzer(Byte[] packetByte)
        {
            Int32 offset     = 0;
            Int64 packetType = PacketUtil.decodePacketType(packetByte, ref offset);

            Packetinterface packet = PacketFactory.getPacket(packetType);

            if (packet == null)
            {
                Console.Write("packet Analyzer failed");
                return(null);
            }

            // 데이터가 있으면 decoding 해서 넘기기
            if (offset < packetByte.Length)
            {
                packet.decode(packetByte, ref offset);
            }
            return(packet);
        }
コード例 #12
0
ファイル: GamePacketProcess.cs プロジェクト: msk0609/OpenSoft
        public void S_ANS_CONNECT(Packetinterface rowPacket)
        {
            PK_S_ANS_CONNECT packet = (PK_S_ANS_CONNECT)rowPacket;

            if (packet.userNumber == 0)
            {
                GameManager.getInstance.userCar  = 0;
                GameManager.getInstance.enemyCar = 1;
            }
            else
            {
                GameManager.getInstance.userCar  = 1;
                GameManager.getInstance.enemyCar = 0;
            }



            GameManager.getInstance.CreateMainCharacter();
            GameManager.getInstance.CreateEnemyCharacter();
        }
コード例 #13
0
ファイル: Network.cs プロジェクト: Kaiose/FinalProject
        public void sendPacket(Packetinterface packet)
        {
            try
            {
                packet.encode();
                //Header -> data 순으로 바이트변환후 packet내 외부스트림에 저장
                MemoryStream packetBlock = new MemoryStream();
                Int32        packetLen   = sizeof(Int32) + (Int32)packet.getStream().Length;

                Byte[] packetHeader = BitConverter.GetBytes(packetLen);
                //packetHeader는 Packet의 총길이
                PacketObfuscation.encodingHeader(ref packetHeader, (int)packetHeader.Length);
                //길이 암호화
                packetBlock.Write(packetHeader, 0, (Int32)packetHeader.Length);


                Byte[] packetData = packet.getStream().ToArray();

                PacketObfuscation.encodingData(ref packetData, (int)packetData.Length);

                packetBlock.Write(packetData, 0, (Int32)packetData.Length);
                //실데이터 암호화후 블럭에 넣음

                Byte[] packetBytes = packetBlock.ToArray();
                // 블럭을 바이트로 변환
                stream_.Write(packetBytes, 0, (int)packetBlock.Length);

                stream_.Flush();
                packetBlock = null;
            }catch (Exception e)
            {
                if (this.isConnected())
                {
                    Debug.Log("잘못된 처리 : send " + e.ToString());
                }
            }
        }
コード例 #14
0
        public void sendPacket(Packetinterface packet)
        {
            //Debug.Log("Send Packet : " + packet.GetType().ToString());
            try
            {
                packet.encode();
                //Header -> data 순으로 바이트변환후 packet내 외부스트림에 저장
                MemoryStream packetBlock = new MemoryStream();
                Int32        packetLen   = sizeof(Int32) + (Int32)packet.getStream().Length;

                Byte[] packetHeader = BitConverter.GetBytes(packetLen);
                //packetHeader는 Packet의 총길이
                packetBlock.Write(packetHeader, 0, (Int32)packetHeader.Length);


                Byte[] packetData = packet.getStream().ToArray();

                packetBlock.Write(packetData, 0, (Int32)packetData.Length);

                Byte[] packetBytes = packetBlock.ToArray();
                // 블럭을 바이트로 변환

                //Debug.Log("Send Size : " + packetBytes.Length.ToString());
                socket.Send(packetBytes);
//                stream_.Write(packetBytes,0, (int)packetBlock.Length);

                //   stream_.Flush();
                packetBlock = null;
            }catch (Exception e)
            {
                if (this.isConnected())
                {
                    Debug.Log("잘못된 처리 : send " + e.ToString());
                }
            }
        }
コード例 #15
0
 public override void S_ANS_EXIT(Packetinterface rowPacket)
 {
 }
コード例 #16
0
ファイル: GamePacketProcess.cs プロジェクト: msk0609/OpenSoft
        public void S_ANS_EXIT(Packetinterface rowPacket)
        {
            PK_S_ANS_EXIT packet = (PK_S_ANS_EXIT)rowPacket;

            GameManager.getInstance.DeleteCharacter(packet.userNumber);
        }
コード例 #17
0
 public void S_ANS_ID_PW_SUCCESS_CHATTING(Packetinterface rowPacket)
 {
 }
コード例 #18
0
 public void sendPacket(Packetinterface packet)
 {
     network.sendPacket(packet);
 }
コード例 #19
0
ファイル: PacketProcess.cs プロジェクト: Kaiose/FinalProject
 public abstract void S_ANS_EXIT(Packetinterface rowPacket);
コード例 #20
0
 public abstract void run(Packetinterface packet);
コード例 #21
0
        private void receive_CallBack(IAsyncResult ar)
        {
            Data   data        = (Data)ar.AsyncState;
            Socket localSocket = data.socket;

            Byte[] packetHeader = new Byte[sizeof(Int32)];
            Byte[] packetBody   = new Byte[1024]; // 임의 크기로 해놈



            Int32 readLen = localSocket.EndReceive(ar);

            if (readLen == 0)
            {
                Debug.Log("Zero Receive Error");
                return;
            }

            //들어온 크기만 큼 packetByte에 복사한다.
            Buffer.BlockCopy(data.buff, 0, packetBytes, totalBytes, readLen);
            totalBytes += readLen;


            Debug.Log("Receive Size : " + readLen.ToString() + "TotalBytes Size : " + totalBytes.ToString());
            while (totalBytes > 0)
            {
                // Array.Clear(packetHeader, 0, sizeof(Int32));
                //  Array.Clear(packetBody, 0, sizeof(Byte) * 1024);
                Int32 currentOffset = 0;
                Int32 offset        = 0;
                Buffer.BlockCopy(packetBytes, currentOffset, packetHeader, 0, sizeof(Int32)); //

                //packet 버퍼에 있는 크기가 헤더 이하이면
                if (totalBytes < BitConverter.ToInt32(packetHeader, 0))
                {
                    Debug.Log("totalBytes is not enough ");
                    break;
                    //localSocket.BeginReceive(data.buff, 0, Data.BuffSize, 0, new AsyncCallback(receive_CallBack), data);

                    //return;
                }
                //packet 버퍼에 있는 크기가 헤더 이상이라면

                //packetHeader 에 packetheader 만큼 복사.


                // Buffer.BlockCopy(packetBytes, currentOffset, packetHeader, 0, sizeof(Int32)); //
                currentOffset += sizeof(Int32); // packetByte의 offset 변경



                // 패킷 총 길이를 가져옴. + offset 증가
                Int32 packetLen = PacketUtil.decodePacketLen(packetHeader, ref offset);
                packetLen -= offset;
                int remainBytes = totalBytes - currentOffset; // packetData에서 헤더를 제외한 남은 바이트
                if (remainBytes < packetLen)
                {
                    Debug.Log("remainBytes is Not enough");

                    break;
                    //localSocket.BeginReceive(data.buff, 0, Data.BuffSize, 0, new AsyncCallback(receive_CallBack), data);

                    /*
                     *
                     *
                     */
                    //return;
                }

                // currentOffset 은 패킷 헤더 이후의 offset
                Buffer.BlockCopy(packetBytes, currentOffset, packetBody, 0, packetLen);
                currentOffset += packetLen;

                Packetinterface rowPacket = PacketUtil.packetAnalyzer(packetBody, packetLen);
                Debug.Log("Receive Packet : " + rowPacket.getType().ToString());
                if (rowPacket == null && localSocket.Connected)
                {
                    Debug.Log("잘못된 패킷이 수신되었습니다.");
                }
                // 큐 구분 해야됨.

                if (PacketQueue == readPacketQueue)
                {
                    lock (writePacketQueue)
                    {
                        writePacketQueue.Enqueue(rowPacket);
                    }
                }
                else
                {
                    lock (readPacketQueue)
                    {
                        readPacketQueue.Enqueue(rowPacket);
                    }
                }
                //writePacketQueue

                //Enqueue(rowPacket);

                //packetBytes 를 사용 했으므로 data 및 offset 수정

                // Buffer.BlockCopy(packetBytes, 0, packetBytes, currentOffset, totalBytes - currentOffset);

                Buffer.BlockCopy(packetBytes, currentOffset, packetBytes, 0, totalBytes - currentOffset);

                totalBytes -= currentOffset;


                /*
                 *  생각할 수 있는 것은 Client에서의 Enqueue 와 Dequeue 사이에서 Lock으로 인한 병목현상이다.
                 *  클라이언트의 Network 는 하나의 스레드가 온전히 recv 하고 enqueue 를 실행하지만
                 *  클라이언트의 Unity Script 에서는 하나의 스레드가 실행 시간을 나누어 dequeue를 실행한다
                 *
                 *
                 *  11/20
                 *
                 *  PacketQueue 에서 Dequeue 하는 부분의 Corutine의 갯수를 증가시켰을때
                 *  전 보다 싱크 의 차이가 줄어드는 것을 확인할 수 있었음.
                 *  즉 병목현상이 맞다고 판단 -> Server와 동일하게 두 개의 버퍼를 만들어 스왚하는 로직을 통해 해소해보자.
                 */
            }
            Array.Clear(data.buff, 0, readLen);
            localSocket.BeginReceive(data.buff, 0, Data.BuffSize, 0, new AsyncCallback(receive_CallBack), data);
        }
コード例 #22
0
ファイル: ContentsProcess.cs プロジェクト: msk0609/OpenSoft
 public bool defaultRun(Packetinterface packet)
 {
     return(false);
 }
コード例 #23
0
ファイル: ContentsProcess.cs プロジェクト: msk0609/OpenSoft
 public abstract void parse(Packetinterface packet);
コード例 #24
0
 public void S_ANS_ID_PW_FAIL(Packetinterface rowPacket)
 {
     Debug.Log("로그인 실패");
 }
コード例 #25
0
        public bool defaultRun(Packetinterface packet)
        {
            PacketType type = (PacketType)packet.type();

            return(false);
        }