Ejemplo n.º 1
0
    // 데이터를 서버로 전송(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);
    }
Ejemplo n.º 2
0
    // 데이터를 서버로 전송(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);
    }
Ejemplo n.º 3
0
    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);
    }
Ejemplo n.º 4
0
    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);
    }
Ejemplo n.º 5
0
    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);
    }
Ejemplo n.º 6
0
    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)
            {
                // 송신 오류.
            }
        }
    }
Ejemplo n.º 7
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);
    }
Ejemplo n.º 8
0
    //데이타를 전송하는 메소드. 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);
            }
        }
    }
Ejemplo n.º 10
0
    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);
    }
Ejemplo n.º 11
0
    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);
    }
Ejemplo n.º 12
0
    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);
    }
Ejemplo n.º 13
0
    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);
    }
Ejemplo n.º 14
0
    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));
    }
Ejemplo n.º 15
0
    //패킷의 헤더 생성
    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);
    }
Ejemplo n.º 16
0
    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("서버와의 연결이 끊겼습니다.");
        }
    }
Ejemplo n.º 17
0
    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);
    }
Ejemplo n.º 18
0
    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();
    }
Ejemplo n.º 19
0
    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);
                }
            }
        }
    }