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); } } }
// 참고: 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); } } }
// 참고 (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); } } }
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); } }