Beispiel #1
0
    private void Receive(int node, byte[] data)
    {
        PacketHeader     header     = new PacketHeader();
        HeaderSerializer serializer = new HeaderSerializer();

        serializer.SetDeserializedData(data);
        bool ret = serializer.Deserialize(ref header);

        if (ret == false)
        {
            Debug.Log("Invalid header data.");
            // 패킷으로서 인식할 수 없으므로 폐기한다.
            return;
        }

        int packetId = (int)header.packetId;

        if (m_notifier.ContainsKey(packetId) &&
            m_notifier[packetId] != null)
        {
            int    headerSize = Marshal.SizeOf(typeof(PacketHeader));
            byte[] packetData = new byte[data.Length - headerSize];
            Buffer.BlockCopy(data, headerSize, packetData, 0, packetData.Length);

            m_notifier[packetId](node, header.packetId, packetData);
        }
    }
Beispiel #2
0
    private bool getPacketContent(byte[] data, out int id, out byte[] outContent)
    {
        PacketHeader     header     = new PacketHeader();
        HeaderSerializer serializer = new HeaderSerializer();

        serializer.SetDeserializedData(data);
        serializer.Deserialize(ref header);


        int headerSize        = 3; // 헤더사이즈 short + byte = 3
        int packetContentSize = data.Length - headerSize;

        byte[] packetContent = null;
        if (packetContentSize > 0) //헤더만 있는 패킷을 대비해서 예외처리, 데이터가 있는 패킷만 데이터를 만든다
        {
            packetContent = new byte[packetContentSize];
            Buffer.BlockCopy(data, headerSize, packetContent, 0, packetContent.Length);
        }
        else
        {
            id         = header.id;
            outContent = null;
            return(false);
        }
        //Debug.Log("받은 패킷 - id : " + header.id + " dataLength : " + packetData.Length);
        id         = header.id;
        outContent = packetContent;
        return(true);
    }
Beispiel #3
0
    private void Receive(int node, byte[] data)
    {
        PacketHeader     header     = new PacketHeader();
        HeaderSerializer serializer = new HeaderSerializer();

        serializer.SetDeserializedData(data);
        bool ret = serializer.Deserialize(ref header);

        if (ret == false)
        {
            Debug.Log("Invalid header data.");
            // 패킷으로서 인식할 수 없으므로 폐기합니다.
            return;
        }
        string str = "";

        for (int i = 0; i < 16; ++i)
        {
            str += data[i] + ":";
        }
        Debug.Log(str);

        int packetId = (int)header.packetId;

        if (packetId < m_notifier.Count && m_notifier[packetId] != null)
        {
            int    headerSize = Marshal.SizeOf(typeof(PacketHeader));
            byte[] packetData = new byte[data.Length - headerSize];
            Buffer.BlockCopy(data, headerSize, packetData, 0, packetData.Length);

            m_notifier[packetId](node, packetData);
        }
    }
Beispiel #4
0
        // private method
        // packet seperater -> header / packet data
        private bool SeperatePacket(byte[] originalData, out int packetID, out byte[] seperatedData)
        {
            PacketHeader     header     = new PacketHeader();
            HeaderSerializer serializer = new HeaderSerializer();

            serializer.SetDeserializedData(originalData);
            serializer.Deserialize(ref header);

            int headerSize     = Marshal.SizeOf(header.id) + Marshal.SizeOf(header.length);
            int packetDataSize = originalData.Length - headerSize;

            byte[] packetData = null;

            if (packetDataSize > 0)
            {
                packetData = new byte[packetDataSize];
                Buffer.BlockCopy(originalData, headerSize, packetData, 0, packetData.Length);
            }
            else
            {
                packetID      = header.id;
                seperatedData = null;
                return(false);
            }

            packetID      = header.id;
            seperatedData = packetData;
            return(true);
        }
    public IEnumerator DataHandle()
    {
        while (true)
        {
            yield return(new WaitForSeconds(0.016f));

            int readCount = receiveMsgs.Count;

            for (int i = 0; i < readCount; i++)
            {
                //패킷을 Dequeue 한다
                //패킷 : 메시지 타입 + 메시지 내용
                DataPacket packet;

                //lock (receiveLock)
                //{
                packet = receiveMsgs.Dequeue();
                //}

                HeaderData       headerData       = new HeaderData();
                HeaderSerializer headerSerializer = new HeaderSerializer();
                headerSerializer.SetDeserializedData(packet.msg);

                if (packet.endPoint == null)
                {
                    headerSerializer.Deserialize(ref headerData);
                    DataReceiver.ResizeByteArray(0, NetworkManager.packetSource + NetworkManager.packetId, ref packet.msg);

                    if (server_notifier.TryGetValue(headerData.id, out serverRecvNotifier))
                    {
                        serverRecvNotifier(packet);
                    }
                    else
                    {
                        Debug.Log("DataHandler::Server.TryGetValue 에러 " + headerData.id);
                    }
                }
                else
                {
                    headerSerializer.UdpDeserialize(ref headerData);

                    DataReceiver.ResizeByteArray(0, NetworkManager.packetSource + NetworkManager.packetId + NetworkManager.udpId, ref packet.msg);

                    if (p2p_notifier.TryGetValue(headerData.id, out p2pRecvNotifier))
                    {
                        p2pRecvNotifier(packet, headerData.udpId);
                    }
                    else
                    {
                        Debug.Log("DataHandler::P2P.TryGetValue 에러 " + headerData.id);
                    }
                }
            }
        }
    }
Beispiel #6
0
    // private method
    // packet seperate id / data
    private bool SeperatePacket(byte[] originalData, out int packetID, out byte[] seperatedData)
    {
        PacketHeader     header     = new PacketHeader();
        HeaderSerializer serializer = new HeaderSerializer();

        serializer.SetDeserializedData(originalData);
        serializer.Deserialize(ref header);

        seperatedData = null;

        packetID = 0;
        return(true);
    }
    //Tcp 데이터 수신
    void TcpReceiveDataCallback(IAsyncResult asyncResult)
    {
        AsyncData asyncData = (AsyncData)asyncResult.AsyncState;
        Socket    tcpSock   = asyncData.sock;

        try
        {
            asyncData.msgSize = (short)tcpSock.EndReceive(asyncResult);
        }
        catch
        {
            Debug.Log("NetworkManager::HandleAsyncDataReceive.EndReceive 에러");
            tcpSock.Close();
            return;
        }

        if (asyncData.msgSize >= NetworkManager.packetId)
        {
            Array.Resize(ref asyncData.msg, asyncData.msgSize + NetworkManager.packetSource + NetworkManager.packetId);
            Debug.Log(asyncData.msg.Length);

            HeaderData       headerData       = new HeaderData();
            HeaderSerializer headerSerializer = new HeaderSerializer();
            headerSerializer.SetDeserializedData(asyncData.msg);
            headerSerializer.Deserialize(ref headerData);

            DataPacket packet = new DataPacket(headerData, asyncData.msg);

            lock (receiveLock)
            {
                try
                {   //큐에 삽입
                    Debug.Log("Enqueue Message Length : " + packet.msg.Length);
                    msgs.Enqueue(packet);
                }
                catch
                {
                    Console.WriteLine("NetworkManager::HandleAsyncDataReceive.Enqueue 에러");
                }
            }
        }

        //재 수신
        asyncData = new AsyncData(tcpSock);
        tcpSock.BeginReceive(asyncData.msg, 0, NetworkManager.packetLength, SocketFlags.None, new AsyncCallback(TcpReceiveLengthCallback), asyncData);
    }
    public void DataHandle()
    {
        while (true)
        {
            if (receiveMsgs.Count > 0)
            {
                DataPacket packet = new DataPacket();

                //패킷을 Dequeue 한다 패킷 : 메시지 타입 + 메시지 내용, 소켓
                lock (receiveLock)
                {
                    try
                    {
                        packet = receiveMsgs.Dequeue();
                    }
                    catch
                    {
                        Console.WriteLine("DataHandler::DataHandle.Dequeue 에러");
                    }
                }

                HeaderData       headerData       = new HeaderData();
                HeaderSerializer headerSerializer = new HeaderSerializer();
                headerSerializer.SetDeserializedData(packet.msg);
                headerSerializer.Deserialize(ref headerData);

                ResizeByteArray(0, UnityServer.packetSource + UnityServer.packetId, ref packet.msg);

                //Dictionary에 등록된 델리게이트 메소드에서 PacketId를 반환받는다.
                if (m_notifier.TryGetValue(headerData.id, out recvNotifier))
                {
                    recvNotifier(packet);
                }
                else
                {
                    Console.WriteLine("DataHandler::DataHandle.TryGetValue 에러 ");
                    Console.WriteLine("패킷 출처 : " + headerData.source);
                    Console.WriteLine("패킷 ID : " + headerData.id);
                }
            }
        }
    }
    //Udp 데이터 수신
    public void UdpReceiveDataCallback(IAsyncResult asyncResult)
    {
        AsyncData asyncData = (AsyncData)asyncResult.AsyncState;

        udpSock = asyncData.sock;

        try
        {
            Debug.Log("메시지 받음");
            asyncData.msgSize = (short)udpSock.EndReceive(asyncResult);
            Debug.Log(asyncData.EP);
        }
        catch (Exception e)
        {
            Debug.Log("연결 끊김 :" + e.Message);
            udpSock.Close();
        }

        if (asyncData.msgSize > 0)
        {
            byte[] msgSize = ResizeByteArray(0, NetworkManager.packetLength, ref asyncData.msg);
            Array.Resize(ref asyncData.msg, BitConverter.ToInt16(msgSize, 0) + NetworkManager.packetSource + NetworkManager.packetId);

            HeaderData       headerData       = new HeaderData();
            HeaderSerializer headerSerializer = new HeaderSerializer();
            headerSerializer.SetDeserializedData(asyncData.msg);
            headerSerializer.Deserialize(ref headerData);

            DataPacket packet = new DataPacket(headerData, asyncData.msg, asyncData.EP);

            lock (receiveLock)
            {   //큐에 삽입
                Debug.Log("Enqueue Message Length : " + asyncData.msg.Length);
                msgs.Enqueue(packet);
            }

            //다시 수신 준비
            asyncData = new AsyncData(udpSock, asyncData.EP);
            udpSock.BeginReceiveFrom(asyncData.msg, 0, AsyncData.msgMaxSize, SocketFlags.None, ref asyncData.EP, new AsyncCallback(UdpReceiveDataCallback), asyncData);
        }
    }