// 데이터를 서버로 전송(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); }
// 데이터를 서버로 전송(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); }
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); }
public int SendUnreliable <T>(IPacket <T> packet) { int sendSize = 0; if (m_udp != 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); sendSize = m_udp.Send(data, data.Length); } return(sendSize); }
public int Send <T>(int node, PacketId id, IPacket <T> packet) { int sendSize = 0; if (m_sessionTcp != null) { // 모듈에서 사용하는 헤더 정보 생성. PacketHeader header = new PacketHeader(); HeaderSerializer serializer = new HeaderSerializer(); header.packetId = id; 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 Packet[" + id + "]"; sendSize = m_sessionTcp.Send(node, data, data.Length); } return(sendSize); }
public void SendReliableToAll(PacketId id, byte[] data) { if (m_tcp != null) { // 모듈에서 사용할 헤더 정보를 생성합니다. PacketHeader header = new PacketHeader(); HeaderSerializer serializer = new HeaderSerializer(); header.packetId = id; byte[] headerData = null; if (serializer.Serialize(header) == true) { headerData = serializer.GetSerializedData(); } byte[] pdata = new byte[headerData.Length + data.Length]; int headerSize = Marshal.SizeOf(typeof(PacketHeader)); Buffer.BlockCopy(headerData, 0, pdata, 0, headerSize); Buffer.BlockCopy(data, 0, pdata, headerSize, data.Length); string str = "Send reliable packet[" + header.packetId + "]"; int sendSize = m_tcp.Send(pdata, pdata.Length); if (sendSize < 0) { // 송신 오류. } } }
public int Send(PacketId id, byte[] data) { int sendSize = 0; if (m_tcp != null) { // 모듈에서 사용할 헤더 정보를 생성합니다. PacketHeader header = new PacketHeader(); HeaderSerializer serializer = new HeaderSerializer(); header.packetId = id; byte[] headerData = null; if (serializer.Serialize(header) == true) { headerData = serializer.GetSerializedData(); } byte[] packetData = new byte[headerData.Length + data.Length]; int headerSize = Marshal.SizeOf(typeof(PacketHeader)); Buffer.BlockCopy(headerData, 0, packetData, 0, headerSize); Buffer.BlockCopy(data, 0, packetData, headerSize, data.Length); sendSize = m_tcp.Send(data, data.Length); } return(sendSize); }
//데이타를 전송하는 메소드. byte[] msg 를 newIPEndPoint로 전송한다. public void DataSend() { if (sendMsgs.Count > 0) { DataPacket packet; lock (sendLock) { packet = sendMsgs.Dequeue(); } Debug.Log("메시지 보냄 : " + packet.endPoint); Debug.Log("메시지 보냄 (길이) : " + packet.headerData.length); Debug.Log("메시지 보냄 (출처) : " + packet.headerData.source); Debug.Log("메시지 보냄 (타입) : " + packet.headerData.id); HeaderSerializer headerSerializer = new HeaderSerializer(); headerSerializer.Serialize(packet.headerData); byte[] header = headerSerializer.GetSerializedData(); byte[] msg = CombineByte(header, packet.msg); if (packet.headerData.source == (byte)DataHandler.Source.ClientSource) { udpSock.BeginSendTo(msg, 0, msg.Length, SocketFlags.None, packet.endPoint, new AsyncCallback(SendData), null); } else if (packet.headerData.source == (byte)DataHandler.Source.ServerSource) { tcpSock.Send(msg, 0, msg.Length, SocketFlags.None); } } }
public void DataHandle() { if (receiveMsgs.Count != 0) { //패킷을 Dequeue 한다 패킷 : 메시지 타입 + 메시지 내용 tcpPacket = receiveMsgs.Dequeue(); //타입과 내용을 분리한다 msgType = tcpPacket.msg [0]; msg = new byte[tcpPacket.msg.Length - 1]; Array.Copy(tcpPacket.msg, 1, msg, 0, msg.Length); //Dictionary에 등록된 델리게이트형 메소드에서 msg를 반환받는다. RecvNotifier recvNotifier; HeaderSerializer serializer = new HeaderSerializer(); HeaderData headerData = new HeaderData(); if (m_notifier.TryGetValue(msgType, out recvNotifier)) { //send 할 id를 반환받음 headerData.id = (byte)recvNotifier(msg); } else { Console.WriteLine("DataHandler::TryGetValue 에러" + msgType); headerData.id = (byte)ServerPacketId.None; } //상대방에게서 게임종료 패캣이 왔을 때는 따로 Send하지 않기 위해서 if (headerData.id == (byte)ServerPacketId.None) { return; } //send할 메시지의 길이를 받음 headerData.length = (short)msg.Length; //헤더 serialize try { serializer.Serialize(headerData); header = serializer.GetSerializedData(); } catch { Console.WriteLine("DataHandler::HeaderSerialize 에러"); } //헤더와 메시지 내용을 합쳐서 Send paket = CombineByte(header, msg); tcpPacket = new TcpPacket(paket, tcpPacket.client); lock (sendLock) { sendMsgs.Enqueue(tcpPacket); } } }
byte[] CreateResultPacket(byte[] msg, ServerPacketId Id) { HeaderData headerData = new HeaderData(); HeaderSerializer HeaderSerializer = new HeaderSerializer(); headerData.Id = (byte)Id; headerData.length = (short)msg.Length; HeaderSerializer.Serialize(headerData); msg = CombineByte(HeaderSerializer.GetSerializedData(), msg); return(msg); }
public void DataRequest(ClientPacketId Id) { //No Packet HeaderData headerData = new HeaderData(); HeaderSerializer HeaderSerializer = new HeaderSerializer(); headerData.Id = (byte)Id; HeaderSerializer.Serialize(headerData); byte[] msg = HeaderSerializer.GetSerializedData(); sendMsg.Enqueue(msg); }
public static byte[] CreateResultPacket(byte[] msg, P2PPacketId Id) { HeaderData headerData = new HeaderData(); HeaderSerializer HeaderSerializer = new HeaderSerializer(); headerData.Id = (byte)Id; headerData.source = (byte)DataHandler.Source.ClientSource; headerData.length = (short)msg.Length; HeaderSerializer.Serialize(headerData); msg = DataHandler.CombineByte(HeaderSerializer.GetSerializedData(), msg); return(msg); }
byte[] CreateHeader <T>(IPacket <T> data, ClientPacketId Id) { byte[] msg = data.GetPacketData(); HeaderData headerData = new HeaderData(); HeaderSerializer headerSerializer = new HeaderSerializer(); headerData.Id = (byte)Id; headerData.length = (short)msg.Length; headerSerializer.Serialize(headerData); byte[] header = headerSerializer.GetSerializedData(); return(header); }
public void Logout() { //No Packet Debug.Log("로그아웃"); HeaderData headerData = new HeaderData(); HeaderSerializer HeaderSerializer = new HeaderSerializer(); headerData.Id = (byte)ClientPacketId.Logout; HeaderSerializer.Serialize(headerData); byte[] msg = HeaderSerializer.GetSerializedData(); sendMsg.Enqueue(msg); StartCoroutine(loadingManager.LoadScene(GameManager.Scene.Wait, GameManager.Scene.Login, 1.0f)); }
//패킷의 헤더 생성 byte[] CreateHeader <T>(Packet <T> data) { byte[] msg = data.GetPacketData(); HeaderData headerData = new HeaderData(); HeaderSerializer headerSerializer = new HeaderSerializer(); headerData.length = (short)msg.Length; headerData.source = (byte)NetworkManager.Source.ClientSource; headerData.id = (byte)data.GetPacketId(); headerSerializer.Serialize(headerData); byte[] header = headerSerializer.GetSerializedData(); return(header); }
public void GameExit() { //No Packet Debug.Log("게임종료"); HeaderData headerData = new HeaderData(); HeaderSerializer HeaderSerializer = new HeaderSerializer(); headerData.Id = (int)ClientPacketId.GameClose; HeaderSerializer.Serialize(headerData); byte[] msg = HeaderSerializer.GetSerializedData(); try { clientSock.Send(msg); } catch { Debug.Log("서버와의 연결이 끊겼습니다."); } }
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 void GameClose() { Debug.Log("게임 종료"); DataPacket packet = CreateResultPacket(new byte[1], (int)DataHandler.Source.ServerSource, (int)ClientPacketId.GameClose); HeaderSerializer headerSerializer = new HeaderSerializer(); headerSerializer.Serialize(packet.headerData); byte[] header = headerSerializer.GetSerializedData(); byte[] msg = CombineByte(header, packet.msg); Debug.Log("메시지 보냄 (길이) : " + msg.Length); Debug.Log("메시지 보냄 (출처) : " + msg[2]); Debug.Log("메시지 보냄 (타입) : " + msg[3]); tcpSock.Send(msg, 0, msg.Length, SocketFlags.None); tcpSock.Close(); udpSock.Close(); }
public void SendReliableToAll(PacketId id, byte[] data) { foreach (NodeInfo info in m_reliableNode) { if (info != null && info.node >= 0) { // 모듈에서 사용하는 헤더 정보를 생성. PacketHeader header = new PacketHeader(); HeaderSerializer serializer = new HeaderSerializer(); header.packetId = id; byte[] headerData = null; if (serializer.Serialize(header) == true) { headerData = serializer.GetSerializedData(); } byte[] packetData = data; byte[] pdata = new byte[headerData.Length + packetData.Length]; int headerSize = Marshal.SizeOf(typeof(PacketHeader)); Buffer.BlockCopy(headerData, 0, pdata, 0, headerSize); Buffer.BlockCopy(packetData, 0, pdata, headerSize, packetData.Length); int sendSize = m_sessionTcp.Send(info.node, pdata, pdata.Length); if (sendSize < 0 && m_eventQueue != null) { // 송신 오류. NetEventState state = new NetEventState(); state.node = info.node; state.type = NetEventType.SendError; state.result = NetEventResult.Failure; m_eventQueue.Add(state); } } } }