예제 #1
0
    public void Execute()
    {
        // Clean up connections
        for (int i = 0; i < Connections.Length; i++)
        {
            if (!Connections[i].IsCreated)
            {
                Connections.RemoveAtSwapBack(i);
                --i;
            }
        }
        // Accept new connections
        NetworkConnection c;

        while ((c = Driver.Accept()) != default(NetworkConnection))
        {
            Connections.Add(c);
            var d = new RawNetworkMessage()
            {
                Length = 0, Type = (uint)MLAPINetworkEvent.Connect, Id = c.InternalId
            };
            PacketData.Enqueue(d);
            Debug.Log("Accepted a connection");
        }
    }
예제 #2
0
    public unsafe void Execute(int index)
    {
        DataStreamReader streamReader;

        Assert.IsTrue(Connections[index].IsCreated);

        NetworkEvent.Type command;
        while ((command = Driver.PopEventForConnection(Connections[index], out streamReader)) != NetworkEvent.Type.Empty)
        {
            if (command == NetworkEvent.Type.Data)
            {
                QueueMessage(ref streamReader, index);
            }
            else if (command == NetworkEvent.Type.Connect)
            {
                var d = new RawNetworkMessage()
                {
                    Length = 0, Type = (uint)MLAPINetworkEvent.Connect, Id = index
                };
                PacketData.Enqueue(d);
            }
            else if (command == NetworkEvent.Type.Disconnect)
            {
                var d = new RawNetworkMessage()
                {
                    Length = 0, Type = (uint)MLAPINetworkEvent.Disconnect, Id = index
                };
                PacketData.Enqueue(d);
                Connections[index] = default;
            }
        }
    }
예제 #3
0
    unsafe public void Execute()
    {
        if (!Connection[0].IsCreated)
        {
            return;
        }

        DataStreamReader streamReader;

        NetworkEvent.Type cmd;

        while ((cmd = Connection[0].PopEvent(Driver, out streamReader)) != NetworkEvent.Type.Empty)
        {
            if (cmd == NetworkEvent.Type.Connect)
            {
                var d = new RawNetworkMessage()
                {
                    Length = 0, Type = (uint)MLAPINetworkEvent.Connect, Id = Connection[0].InternalId
                };
                PacketData.Enqueue(d);
            }
            else if (cmd == NetworkEvent.Type.Data)
            {
                byte channelId   = streamReader.ReadByte();
                int  messageSize = streamReader.ReadInt();

                var temp = new NativeArray <byte>(messageSize, Allocator.Temp);
                streamReader.ReadBytes(temp);

                var d = new RawNetworkMessage()
                {
                    Length    = messageSize,
                    Type      = (uint)MLAPINetworkEvent.Data,
                    Id        = Connection[0].InternalId,
                    ChannelId = channelId
                };

                UnsafeUtility.MemCpy(d.Data, temp.GetUnsafePtr(), d.Length);

                PacketData.Enqueue(d);
            }
            else if (cmd == NetworkEvent.Type.Disconnect)
            {
                Connection[0] = default;
            }
        }
    }
예제 #4
0
    private unsafe void QueueMessage(ref DataStreamReader streamReader, int index)
    {
        byte channelId   = streamReader.ReadByte();
        int  messageSize = streamReader.ReadInt();

        var temp = new NativeArray <byte>(messageSize, Allocator.Temp);

        streamReader.ReadBytes(temp);

        //  Debug.Log($"Server: Got a message {channelId} {messageSize} ");

        var d = new RawNetworkMessage()
        {
            Length    = messageSize,
            Type      = (uint)MLAPINetworkEvent.Data,
            Id        = index,
            ChannelId = channelId
        };

        UnsafeUtility.MemCpy(d.Data, temp.GetUnsafePtr(), d.Length);
        PacketData.Enqueue(d);
    }