public override void OnConnected(EndPoint endPoint)
        {
            Console.WriteLine($"OnConnected : {endPoint}");
            PlayerInfoReq packet = new PlayerInfoReq()
            {
                playerId = 1001, name = "HELLO"
            };

            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 101, level = 1, duration = 3.0f
            });
            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 201, level = 2, duration = 4.0f
            });
            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 301, level = 3, duration = 5.0f
            });
            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 401, level = 4, duration = 6.0f
            });

            //for (int i = 0; i < 5; i++)
            {
                ArraySegment <byte> s = packet.Write();
                #region 주석처리
                //byte[] size = BitConverter.GetBytes(packet.size);
                //byte[] packetId = BitConverter.GetBytes(packet.packetId);
                //byte[] playerId = BitConverter.GetBytes(packet.playerId);

                //Array.Copy(size, 0, s.Array, s.Offset+count, 2);
                //count += 2;
                //Array.Copy(packetId, 0, s.Array, s.Offset + count, 2);
                //count += 2;
                //Array.Copy(playerId, 0, s.Array, s.Offset+count, 8);
                //count += 8;
                #endregion

                //궁금점? : 왜 큰 버퍼를 두고 잘라 사용해야하는가? 길이를 안다면 그만큼만 보내면 되는 것 아닌가?
                // -> 가변적 + 메모리 낭비 줄이기
                if (s != null)
                {
                    Send(s);
                }
            }
        }
        public override void OnConnected(EndPoint endPoint)
        {
            Console.WriteLine($"{endPoint}에 연결되었습니다.");

            PlayerInfoReq packet = new PlayerInfoReq()
            {
                playerId = 1001
            };

            for (int i = 0; i < 5; i++)
            {
                // 이제 패킷 타입만 PlayerInfoReq로 선언하면,
                // Serialize()를 통해 해당 클래스 구성을 몰라도 직렬화할 수 있다.
                ArraySegment <byte> sendBuff = packet.Serialize();

                if (sendBuff != null)
                {
                    Send(sendBuff);
                }
            }
        }
        public override void OnConnected(EndPoint endPoint)
        {
            Console.WriteLine($"{endPoint}에 연결되었습니다.");

            PlayerInfoReq packet = new PlayerInfoReq()
            {
                playerId = 1001, playerName = "태사단"
            };

            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 101, level = 5, duration = 0.3f
            });
            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 102, level = 7, duration = 20f
            });
            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 105, level = 1, duration = 3f
            });
            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 201, level = 2, duration = 0.05f
            });

            for (int i = 0; i < 5; i++)
            {
                // 이제 패킷 타입만 PlayerInfoReq로 선언하면,
                // Serialize()를 통해 해당 클래스 구성을 몰라도 직렬화할 수 있다.
                ArraySegment <byte> sendBuff = packet.Serialize();

                if (sendBuff != null)
                {
                    Send(sendBuff);
                }
            }
        }
Example #4
0
        // 참고: unsafe를 이용하여 C++의 포인터 조작과 유사한 동작을 실행할 수 있다.
        //		 이는 추후 다룰 예정.

        /*
         * static unsafe void ToBytes(byte[] array, int offset, ulong value)
         * {
         *      fixed (byte* ptr = &array[offset])
         *(ulong*)ptr = value;
         * }
         */

        public override void OnConnected(EndPoint endPoint)
        {
            Console.WriteLine($"{endPoint}에 연결되었습니다.");

            PlayerInfoReq packet = new PlayerInfoReq()
            {
                packetId = (ushort)PacketID.PlayerInfoReq,
                playerId = 1001
            };

            for (int i = 0; i < 5; i++)
            {
                ArraySegment <byte> arr = SendBufferHelper.Open(4096);

                // * 수정된 부분
                // TryWriteBytes를 이용하여, GetByte로 변환 후 복사하는 과정을 한 번에 실행한다.
                // success에 비트 연산을 통해 한 번이라도 실패했다면 false로 바뀌게 한다.
                ushort count   = 0;
                bool   success = true;

                // 패킷 크기가 들어갈 부분은 2바이트 비워준다.
                count   += 2;
                success &= BitConverter.TryWriteBytes(new Span <byte>(arr.Array, arr.Offset + count, arr.Count - count), packet.packetId);
                count   += 2;
                success &= BitConverter.TryWriteBytes(new Span <byte>(arr.Array, arr.Offset + count, arr.Count - count), packet.playerId);
                count   += 8;

                // 패킷의 크기는 미리 패킷에 정의해두지 않고, 보낼 때 크기를 센 다음 마지막에 count로 입력해준다.
                success &= BitConverter.TryWriteBytes(new Span <byte>(arr.Array, arr.Offset, arr.Count), count);

                ArraySegment <byte> sendBuff = SendBufferHelper.Close(count);

                if (success)
                {
                    Send(sendBuff);
                }
            }
        }
Example #5
0
        // 참고 (c#에서 포인터 사용)

        /*
         * static unsafe void ToBytes(byte[] array, int offset, ulong value)
         * {
         *  fixed (byte* ptr = &array[offset])
         *(ulong*)ptr = value;
         * }
         */


        public override void OnConnected(EndPoint endPoint)
        {
            Console.WriteLine($"OnConnected: {endPoint}");

            PlayerInfoReq packet = new PlayerInfoReq()
            {
                playerId = 1001, name = "ABCD"
            };

            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 101, level = 1, duration = 3.0f
            });
            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 201, level = 2, duration = 1.0f
            });
            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 301, level = 3, duration = 2.0f
            });
            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 401, level = 4, duration = 4.0f
            });

            // Send
            // for (int i = 0; i < 10; i++)
            {
                ArraySegment <byte> s = packet.Write();

                if (s != null)
                {
                    Send(s);
                }
            }
        }
Example #6
0
        public override void OnConnected(EndPoint endPoint)
        {
            Console.WriteLine($"Connected: {endPoint}");

            PlayerInfoReq packet = new PlayerInfoReq()
            {
                playerID = 1001, name = "SeungHu"
            };

            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 101, level = 1, duration = 3.75f
            });
            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 201, level = 2, duration = 2.75f
            });
            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 301, level = 3, duration = 1.75f
            });
            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 401, level = 4, duration = 1.5f
            });
            packet.skills.Add(new PlayerInfoReq.SkillInfo()
            {
                id = 501, level = 5, duration = 0.75f
            });

            ArraySegment <byte> sendBuff = packet.Write();

            if (sendBuff != null)
            {
                Send(sendBuff);
            }
        }