/// <summary> /// 패킷을 추가한다. /// </summary> /// <param name="packetCreator">패킷 팩토리</param> //public void Add(IPacketCreator packetCreator) //{ // if (true == PacketCreator.ContainsKey(packetCreator.GetPacketId())) // { // throw new Exception(String.Format("a packet id already exists (packet_id: {0})", packetCreator.GetPacketId())); // } // PacketCreator.Add(packetCreator.GetPacketId(), packetCreator); //} public void Add(IPacket packetCreator) { if (true == PacketCreator.ContainsKey(packetCreator.GetPacketId())) { throw new Exception(String.Format("a packet id already exists (packet_id: {0})", packetCreator.GetPacketId())); } PacketCreator.Add(packetCreator.GetPacketId(), packetCreator); }
public bool Execute(IPeer peer, IPacket packet) { if (false == PacketHandlerMap.ContainsKey(packet.GetPacketId())) { return(false); } IPacketHandler packetHandler = PacketHandlerMap[packet.GetPacketId()]; packetHandler.Execute(peer, packet); return(true); }
// 데이터를 서버로 전송(TCP) public int SendReliable <T>(IPacket <T> packet) { int sendSize = 0; if (transportTCP != null) { // 모듈에서 사용할 헤더 정보를 생성합니다. PacketHeader header = new PacketHeader(); HeaderSerializer serializer = new HeaderSerializer(); //packetid = skill, moving 등등 moving은 2 header.packetId = (int)packet.GetPacketId(); byte[] headerData = null; if (serializer.Serialize(header) == true) { headerData = serializer.GetSerializedData(); } byte[] packetData = packet.GetData(); //움직임 정보 들은 데이터 byte[] data = new byte[headerData.Length + packetData.Length]; int headerSize = Marshal.SizeOf(typeof(PacketHeader)); Buffer.BlockCopy(headerData, 0, data, 0, headerSize); Buffer.BlockCopy(packetData, 0, data, headerSize, packetData.Length); string str = "Send reliable packet[" + header.packetId + "]"; sendSize = transportTCP.Send(data, data.Length); } return(sendSize); }
private byte[] CreatePacket <T>(IPacket <T> packet) // 패킷 만드는 메서드 { byte[] packetData = packet.GetPacketData(); // 패킷의 데이터를 바이트화 // 헤더 생성 PacketHeader header = new PacketHeader(); HeaderSerializer serializer = new HeaderSerializer(); header.length = (short)packetData.Length; // 패킷 데이터의 길이를 헤더에 입력 header.id = (byte)packet.GetPacketId(); // 패킷 데이터에서 ID를 가져와 헤더에 입력 //Debug.Log("패킷 전송 - id : " + header.id.ToString() + " length :" + header.length); byte[] headerData = null; if (serializer.Serialize(header) == false) { return(null); } headerData = serializer.GetSerializedData(); // 헤더 데이터를 패킷 바이트로 변환 byte[] data = new byte[headerData.Length + header.length]; // 최종 패킷의 길이 = 헤더패킷길이+내용패킷길이 // 헤더와 내용을 하나의 배열로 복사 int headerSize = Marshal.SizeOf(header.id) + Marshal.SizeOf(header.length); Buffer.BlockCopy(headerData, 0, data, 0, headerSize); Buffer.BlockCopy(packetData, 0, data, headerSize, packetData.Length); return(data); }
// 데이터를 서버로 전송(UDP) public int SendUnreliable <T>(IPacket <T> packet) { int sendSize = 0; if (transportUDP != null) { // 헤더 정보 생성 PacketHeader header = new PacketHeader(); HeaderSerializer serializer = new HeaderSerializer(); // FIX THIS : 명시적 형변환 해줌. 소스코드와 다름 header.packetId = (int)packet.GetPacketId(); byte[] headerData = null; if (serializer.Serialize(header) == true) { headerData = serializer.GetSerializedData(); } byte[] packetData = packet.GetData(); byte[] data = new byte[headerData.Length + packetData.Length]; int headerSize = Marshal.SizeOf(typeof(PacketHeader)); Buffer.BlockCopy(headerData, 0, data, 0, headerSize); Buffer.BlockCopy(packetData, 0, data, headerSize, packetData.Length); sendSize = transportUDP.Send(data, data.Length); } return(sendSize); }
public int SendReliable <T>(int node, IPacket <T> packet) { int sendSize = 0; if (m_sessionTcp != null) { // 모듈에서 사용할 헤더 정보를 생성합니다. PacketHeader header = new PacketHeader(); HeaderSerializer serializer = new HeaderSerializer(); header.packetId = packet.GetPacketId(); byte[] headerData = null; if (serializer.Serialize(header) == true) { headerData = serializer.GetSerializedData(); } byte[] packetData = packet.GetData(); byte[] data = new byte[headerData.Length + packetData.Length]; int headerSize = Marshal.SizeOf(typeof(PacketHeader)); Buffer.BlockCopy(headerData, 0, data, 0, headerSize); Buffer.BlockCopy(packetData, 0, data, headerSize, packetData.Length); string str = "Send reliable packet[" + header.packetId + "]"; sendSize = m_sessionTcp.Send(node, data, data.Length); } return(sendSize); }
public string MarshalDataNoEnc(IPacket packet) { return(String.Format("{0},{1}", Convert.ToString((int)packet.GetPacketId()), packet.MarshalDataNoEnc())); //데이타를 암호화 하지 말고 시리얼 라이징 해라. }
public int SendToAllGuest <T>(IPacket <T> packet) // 패킷에 헤더를 부여하고 송신하는 메서드 { int sendSize = 0; byte[] data = CreatePacket(packet); if (data == null) { Debug.Log("SendToAllGuest() - 잘못된 패킷" + packet.GetPacketId().ToString()); return(0); } //전송 m_host.SendAll(data, data.Length); return(sendSize); }
public int SendReliable <T>(int node, IPacket <T> packet) { int sendSize = 0; if (m_sessionTcp != null) { // 모듈에서 사용하는 헤더 정보를 생성. PacketHeader header = new PacketHeader(); HeaderSerializer serializer = new HeaderSerializer(); header.packetId = packet.GetPacketId(); byte[] headerData = null; if (serializer.Serialize(header) == true) { headerData = serializer.GetSerializedData(); } byte[] packetData = packet.GetData(); byte[] data = new byte[headerData.Length + packetData.Length]; int headerSize = Marshal.SizeOf(typeof(PacketHeader)); Buffer.BlockCopy(headerData, 0, data, 0, headerSize); Buffer.BlockCopy(packetData, 0, data, headerSize, packetData.Length); //string str = "Send reliable packet[" + header.packetId + "]"; sendSize = m_sessionTcp.Send(node, data, data.Length); if (sendSize < 0 && m_eventQueue != null) { // 송신 오류. NetEventState state = new NetEventState(); state.node = node; state.type = NetEventType.SendError; state.result = NetEventResult.Failure; m_eventQueue.Add(state); } } return(sendSize); }
public string Marshal(IPacket packet) { return(String.Format("{0},{1}", Convert.ToString((int)packet.GetPacketId()), packet.Marshal())); }