public void Dispose()
        {
            if (IsCreated)
            {
                var connections = m_Connections.GetValueArray(Allocator.Temp);
                foreach (var con in connections)
                {
                    if (!Listening && Library.Initialized)
                    {
                        m_Sockets.CloseConnection(con.Id);
                    }
                    con.Dispose();
                }

                if (Listening && Library.Initialized)
                {
                    m_Sockets.CloseListenSocket(m_ListeningSocket);
                }
            }

            m_Connections.Dispose();
            m_QueuedConnections.Dispose();
            m_PipelineReliableIds.Dispose();
            m_PipelineUnreliableIds.Dispose();
            m_DataStream.Dispose();
        }
Пример #2
0
    public void AddConnectedGhostClientsToNewClient(NetworkConnection connection)
    {
        var length = Server.Connections.Length;
        var size   = 8 + (8 * length);
        var writer = new DataStreamWriter(size, Allocator.Temp);

        writer.Write(AddPreviousGhostSenderId);
        writer.Write(length - 1);

        /*
         * foreach (var c in Server.Connections)
         * {
         *  if (c.InternalId == connection.InternalId)
         *      continue;
         *
         *  var ghost = Spawner.Instances.SingleOrDefault(x => x.ConnectionId == c.InternalId);
         *  writer.Write(ghost.PrefabId);
         *  writer.Write(ghost.GetInstanceID());
         *
         * }
         */

        Server.Driver.Send(NetworkPipeline.Null, connection, writer);
        writer.Dispose();
    }
Пример #3
0
    static NetworkConnection ProcessSingleConnection(UdpCNetworkDriver.Concurrent driver, NetworkConnection connection)
    {
        DataStreamReader strm;

        NetworkEvent.Type cmd;
        // Pop all events for the connection
        while ((cmd = driver.PopEventForConnection(connection, out strm)) != NetworkEvent.Type.Empty)
        {
            if (cmd == NetworkEvent.Type.Data)
            {
                // For ping requests we reply with a pong message
                // A DataStreamReader.Context is required to keep track of current read position since
                // DataStreamReader is immutable
                var readerCtx = default(DataStreamReader.Context);
                int id        = strm.ReadInt(ref readerCtx);
                // Create a temporary DataStreamWriter to keep our serialized pong message
                var pongData = new DataStreamWriter(4, Allocator.Temp);
                pongData.Write(id);
                // Send the pong message with the same id as the ping
                driver.Send(connection, pongData);
                pongData.Dispose();
            }
            else if (cmd == NetworkEvent.Type.Disconnect)
            {
                // When disconnected we make sure the connection return false to IsCreated so the next frames
                // DriverUpdateJob will remove it
                return(default(NetworkConnection));
            }
        }

        return(connection);
    }
Пример #4
0
        public IEnumerator ServerAndClient_SendMessageWithMaxLength_SentAndReceivedWithoutErrors()
        {
            SetupServerAndClientAndConnectThem(0);

            //send data from client
            DataStreamWriter m_OutStream = new DataStreamWriter(1500, Allocator.Persistent);

            m_OutStream.Clear();
            int messageLength = 1400;

            byte[] messageToSend = new byte[messageLength];
            for (int i = 0; i < messageLength; i++)
            {
                messageToSend[i] = (byte)(33 + (i % 93));
            }

            m_OutStream.Write(messageToSend);
            clientToServerConnection.Send(client_driver, m_OutStream);
            m_OutStream.Dispose();

            server_driver.ScheduleUpdate().Complete();
            ev = server_driver.PopEventForConnection(connectionToClient, out stream);
            Assert.IsTrue(ev == NetworkEvent.Type.Data, "Expected to get Type.Data");
            var readerCtx = default(DataStreamReader.Context);
            var msg       = stream.ReadBytesAsArray(ref readerCtx, stream.Length);

            Assert.IsTrue(msg.Length == messageLength, "Lenghts of sent and received messages are different");

            DisconnectAndCleanup();
            yield return(null);
        }
Пример #5
0
        public IEnumerator ServerAndClient_SendMessageWithMoreThenMaxLength_OverflowsIncomingDriverBuffer()
        {
            SetupServerAndClientAndConnectThem(0);

            //send data from client
            DataStreamWriter m_OutStream = new DataStreamWriter(1500, Allocator.Persistent);

            m_OutStream.Clear();
            int messageLength = 1401;

            byte[] messageToSend = new byte[messageLength];
            for (int i = 0; i < messageLength; i++)
            {
                messageToSend[i] = (byte)(33 + (i % 93));
            }

            m_OutStream.Write(messageToSend);
            clientToServerConnection.Send(client_driver, m_OutStream);
            LogAssert.Expect(LogType.Error, "Error on receive 10040");
            m_OutStream.Dispose();

            //handle sent data
            server_driver.ScheduleUpdate().Complete();
            client_driver.ScheduleUpdate().Complete();

            Assert.AreEqual(10040, server_driver.ReceiveErrorCode);

            DisconnectAndCleanup();
            yield return(null);
        }
Пример #6
0
        public void IPC_TearDown()
        {
            Driver.Dispose();
            RemoteDriver.Dispose();
            Stream.Dispose();

            IPCManager.Instance.Destroy();
        }
Пример #7
0
            public void Execute()
            {
                var strmWriter = new DataStreamWriter(4, Allocator.Temp);

                strmWriter.Write(42);
                connection.Send(driver, strmWriter);
                strmWriter.Dispose();
            }
Пример #8
0
 public void WriteToAllConnections(DataStreamWriter writer)
 {
     foreach (var connection in m_Connections)
     {
         m_Driver.Send(NetworkPipeline.Null, connection, writer);
         writer.Dispose();
     }
 }
Пример #9
0
        public void SendReceiveInParallelJobWorks()
        {
            var serverDriver = new LocalNetworkDriver(new NetworkDataStreamParameter {
                size = 64
            });

            serverDriver.Bind(IPCManager.Instance.CreateEndPoint());
            serverDriver.Listen();
            var clientDriver0 = new LocalNetworkDriver(new NetworkDataStreamParameter {
                size = 64
            });
            var clientDriver1 = new LocalNetworkDriver(new NetworkDataStreamParameter {
                size = 64
            });
            var serverToClient = new NativeArray <NetworkConnection>(2, Allocator.TempJob);
            var strmWriter     = new DataStreamWriter(4, Allocator.Temp);

            strmWriter.Write(42);
            var clientToServer0 = clientDriver0.Connect(serverDriver.LocalEndPoint());
            var clientToServer1 = clientDriver1.Connect(serverDriver.LocalEndPoint());

            WaitForConnected(clientDriver0, serverDriver, clientToServer0);
            serverToClient[0] = serverDriver.Accept();
            Assert.IsTrue(serverToClient[0].IsCreated);
            WaitForConnected(clientDriver1, serverDriver, clientToServer1);
            serverToClient[1] = serverDriver.Accept();
            Assert.IsTrue(serverToClient[1].IsCreated);
            clientToServer0.Send(clientDriver0, strmWriter);
            clientToServer1.Send(clientDriver1, strmWriter);
            strmWriter.Dispose();
            clientDriver0.ScheduleUpdate().Complete();
            clientDriver1.ScheduleUpdate().Complete();

            var sendRecvJob = new SendReceiveParallelJob {
                driver = serverDriver.ToConcurrent(), connections = serverToClient
            };
            var jobHandle = serverDriver.ScheduleUpdate();

            jobHandle = sendRecvJob.Schedule(serverToClient.Length, 1, jobHandle);
            serverDriver.ScheduleUpdate(jobHandle).Complete();

            DataStreamReader strmReader;

            clientDriver0.ScheduleUpdate().Complete();
            Assert.AreEqual(NetworkEvent.Type.Data, clientToServer0.PopEvent(clientDriver0, out strmReader));
            var ctx = default(DataStreamReader.Context);

            Assert.AreEqual(43, strmReader.ReadInt(ref ctx));
            clientDriver1.ScheduleUpdate().Complete();
            Assert.AreEqual(NetworkEvent.Type.Data, clientToServer1.PopEvent(clientDriver1, out strmReader));
            ctx = default(DataStreamReader.Context);
            Assert.AreEqual(43, strmReader.ReadInt(ref ctx));

            serverToClient.Dispose();
            clientDriver0.Dispose();
            clientDriver1.Dispose();
            serverDriver.Dispose();
        }
Пример #10
0
        public IEnumerator ServerAndClient_PingPong_Successfully()
        {
            SetupServerAndClientAndConnectThem(0);

            //send data from client
            DataStreamWriter m_OutStream = new DataStreamWriter(16, Allocator.Persistent);

            m_OutStream.Clear();
            m_OutStream.Write(SharedConstants.ping);
            clientToServerConnection.Send(client_driver, m_OutStream);

            //handle sent data
            server_driver.ScheduleUpdate().Complete();
            ev = server_driver.PopEventForConnection(connectionToClient, out stream);
            Assert.IsTrue(ev == NetworkEvent.Type.Data, "Expected to get Type.Data");
            var readerCtx = default(DataStreamReader.Context);
            var msg       = stream.ReadBytesAsArray(ref readerCtx, stream.Length);

            if (msg.Length == SharedConstants.ping.Length)
            {
                for (var i = 0; i < msg.Length; i++)
                {
                    if (SharedConstants.ping[i] != msg[i])
                    {
                        Assert.Fail("Data reading error");
                    }
                }
            }

            client_driver.ScheduleUpdate().Complete();

            //send data from server
            m_OutStream.Clear();
            m_OutStream.Write(SharedConstants.pong);
            connectionToClient.Send(server_driver, m_OutStream);
            m_OutStream.Dispose();

            //handle sent data
            server_driver.ScheduleUpdate().Complete();
            client_driver.ScheduleUpdate().Complete();
            ev = clientToServerConnection.PopEvent(client_driver, out stream);
            Assert.IsTrue(ev == NetworkEvent.Type.Data, "Expected to get Type.Data");
            readerCtx = default(DataStreamReader.Context);
            msg       = stream.ReadBytesAsArray(ref readerCtx, stream.Length);
            if (msg.Length == SharedConstants.pong.Length)
            {
                for (var i = 0; i < msg.Length; i++)
                {
                    if (SharedConstants.pong[i] != msg[i])
                    {
                        Assert.Fail("Data reading error");
                    }
                }
            }

            DisconnectAndCleanup();
            yield return(null);
        }
Пример #11
0
    void FixedUpdate()
    {
        // Update the ping client UI with the ping statistics computed by teh job scheduled previous frame since that
        // is now guaranteed to have completed
        PingClientUIBehaviour.UpdateStats(m_numPingsSent, m_lastPingTime);

        // Update the NetworkDriver. It schedules a job so we must wait for that job with Complete
        m_ClientDriver.ScheduleUpdate().Complete();

        // If the client ui indicates we should be sending pings but we do not have an active connection we create one
        if (PingClientUIBehaviour.ServerEndPoint.IsValid && !m_clientToServerConnection.IsCreated)
        {
            m_clientToServerConnection = m_ClientDriver.Connect(PingClientUIBehaviour.ServerEndPoint);
        }
        // If the client ui indicates we should not be sending pings but we do have a connection we close that connection
        if (!PingClientUIBehaviour.ServerEndPoint.IsValid && m_clientToServerConnection.IsCreated)
        {
            m_clientToServerConnection.Disconnect(m_ClientDriver);
            m_clientToServerConnection = default(NetworkConnection);
        }

        DataStreamReader strm;

        NetworkEvent.Type cmd;
        // Process all events on the connection. If the connection is invalid it will return Empty immediately
        while ((cmd = m_clientToServerConnection.PopEvent(m_ClientDriver, out strm)) != NetworkEvent.Type.Empty)
        {
            if (cmd == NetworkEvent.Type.Connect)
            {
                // When we get the connect message we can start sending data to the server
                // Set the ping id to a sequence number for the new ping we are about to send
                m_pendingPing = new PendingPing {
                    id = m_numPingsSent, time = Time.fixedTime
                };
                // Create a 4 byte data stream which we can store our ping sequence number in
                var pingData = new DataStreamWriter(4, Allocator.Temp);
                pingData.Write(m_numPingsSent);
                m_clientToServerConnection.Send(m_ClientDriver, pingData);
                pingData.Dispose();
                // Update the number of sent pings
                ++m_numPingsSent;
            }
            else if (cmd == NetworkEvent.Type.Data)
            {
                // When the pong message is received we calculate the ping time and disconnect
                m_lastPingTime = (int)((Time.fixedTime - m_pendingPing.time) * 1000);
                m_clientToServerConnection.Disconnect(m_ClientDriver);
                m_clientToServerConnection = default(NetworkConnection);
            }
            else if (cmd == NetworkEvent.Type.Disconnect)
            {
                // If the server disconnected us we clear out connection
                m_clientToServerConnection = default(NetworkConnection);
            }
        }
    }
Пример #12
0
 public void Dispose()
 {
     UpdateHandle.Complete();
     DriverHandle.Dispose();
     ConnectionHandle.Dispose();
     PendingSoakMessages.Dispose();
     SoakClientStreamWriter.Dispose();
     SoakJobDataPacket.Dispose();
     SoakJobContextsHandle.Dispose();
     SoakStatisticsHandle.Dispose();
 }
Пример #13
0
        protected override void OnDestroy()
        {
            m_DataStream.Dispose();

            foreach (var kvp in m_SerializeLookup)
            {
                kvp.Value.Data.Dispose();
            }

            m_SerializeLookup.Clear();
        }
    void FixedUpdate()
    {
        // Update the NetworkDriver. It schedules a job so we must wait for that job with Complete
        m_ServerDriver.ScheduleUpdate().Complete();

        // Accept all new connections
        while (true)
        {
            var con = m_ServerDriver.Accept();
            // "Nothing more to accept" is signaled by returning an invalid connection from accept
            if (!con.IsCreated)
            {
                break;
            }
            m_connections.Add(con);
        }

        for (int i = 0; i < m_connections.Length; ++i)
        {
            DataStreamReader  strm;
            NetworkEvent.Type cmd;
            // Pop all events for the connection
            while ((cmd = m_ServerDriver.PopEventForConnection(m_connections[i], out strm)) != NetworkEvent.Type.Empty)
            {
                if (cmd == NetworkEvent.Type.Data)
                {
                    // For ping requests we reply with a pong message
                    // A DataStreamReader.Context is required to keep track of current read position since
                    // DataStreamReader is immutable
                    var readerCtx = default(DataStreamReader.Context);
                    int id        = strm.ReadInt(ref readerCtx);
                    // Create a temporary DataStreamWriter to keep our serialized pong message
                    var pongData = new DataStreamWriter(4, Allocator.Temp);
                    pongData.Write(id);
                    // Send the pong message with the same id as the ping
                    m_ServerDriver.Send(m_connections[i], pongData);
                    pongData.Dispose();
                }
                else if (cmd == NetworkEvent.Type.Disconnect)
                {
                    // This connection no longer exist, remove it from the list
                    // The next iteration will operate on the new connection we swapped in so as long as it exist the
                    // loop can continue
                    m_connections.RemoveAtSwapBack(i);
                    if (i >= m_connections.Length)
                    {
                        break;
                    }
                }
            }
        }
    }
Пример #15
0
        protected override void OnDestroy()
        {
            m_SerialSpawnChunks.Dispose();
            m_CompressionModel.Dispose();
            m_AllocatedGhostIds.Dispose();
            m_FreeGhostIds.Dispose();
            m_DataStream.Dispose();
            foreach (var connectionState in m_ConnectionStates)
            {
                connectionState.Dispose();
            }

            m_ConnectionStateLookup.Dispose();
        }
Пример #16
0
        public void Execute()
        {
            if (serverEP.IsValid && connections.Length == 0)
            {
                commandBuffer.CreateEntity();
                commandBuffer.AddComponent(new PingClientConnectionComponentData {
                    connection = driver.Connect(serverEP)
                });
            }
            if (!serverEP.IsValid && connections.Length > 0)
            {
                for (int con = 0; con < connections.Length; ++con)
                {
                    connections[con].connection.Disconnect(driver);
                    commandBuffer.DestroyEntity(connectionEntities[con]);
                }

                return;
            }
            for (int con = 0; con < connections.Length; ++con)
            {
                DataStreamReader  strm;
                NetworkEvent.Type cmd;
                while ((cmd = connections[con].connection.PopEvent(driver, out strm)) != NetworkEvent.Type.Empty)
                {
                    if (cmd == NetworkEvent.Type.Connect)
                    {
                        pendingPings[0] = new PendingPing {
                            id = pingStats[0], time = fixedTime
                        };
                        var pingData = new DataStreamWriter(4, Allocator.Temp);
                        pingData.Write(pingStats[0]);
                        connections[con].connection.Send(driver, pingData);
                        pingData.Dispose();
                        pingStats[0] = pingStats[0] + 1;
                    }
                    else if (cmd == NetworkEvent.Type.Data)
                    {
                        pingStats[1] = (int)((fixedTime - pendingPings[0].time) * 1000);
                        connections[con].connection.Disconnect(driver);
                        commandBuffer.DestroyEntity(connectionEntities[con]);
                    }
                    else if (cmd == NetworkEvent.Type.Disconnect)
                    {
                        commandBuffer.DestroyEntity(connectionEntities[con]);
                    }
                }
            }
        }
Пример #17
0
    public void Execute(int i)
    {
        SoakMessage inbound  = default(SoakMessage);
        SoakMessage outbound = default(SoakMessage);

        if (connections[i].Connection.IsCreated)
        {
            var ctx = connections[i];
            DataStreamReader  strm;
            NetworkEvent.Type cmd;
            bool close = false;
            while ((cmd = driver.PopEventForConnection(ctx.Connection, out strm)) != NetworkEvent.Type.Empty)
            {
                if (cmd == NetworkEvent.Type.Data)
                {
                    var readerCtx = default(DataStreamReader.Context);
                    unsafe
                    {
                        if (!strm.IsCreated)
                        {
                            Debug.Log("wtf not created.");
                        }
                        strm.ReadBytes(ref readerCtx, inbound.data, strm.Length);
                        Assert.AreEqual(strm.Length, inbound.length + SoakMessage.HeaderLength);

                        outbound.id       = inbound.id;
                        outbound.sequence = ctx.NextSequenceId++;

                        var soakData = new DataStreamWriter(SoakMessage.HeaderLength, Allocator.Temp);
                        soakData.WriteBytes(outbound.data, SoakMessage.HeaderLength);

                        driver.Send(connections[i].Connection, soakData);
                        soakData.Dispose();
                    }
                }
                else if (cmd == NetworkEvent.Type.Disconnect)
                {
                    close = true;
                }
            }

            if (close)
            {
                ctx.Connection     = default(NetworkConnection);
                ctx.NextSequenceId = -1;
            }
            connections[i] = ctx;
        }
    }
Пример #18
0
        public void Execute()
        {
            // If the client ui indicates we should be sending pings but we do not have an active connection we create one
            if (serverEP.IsValid && !connection[0].IsCreated)
            {
                connection[0] = driver.Connect(serverEP);
            }
            // If the client ui indicates we should not be sending pings but we do have a connection we close that connection
            if (!serverEP.IsValid && connection[0].IsCreated)
            {
                connection[0].Disconnect(driver);
                connection[0] = default(NetworkConnection);
            }

            DataStreamReader strm;

            NetworkEvent.Type cmd;
            // Process all events on the connection. If the connection is invalid it will return Empty immediately
            while ((cmd = connection[0].PopEvent(driver, out strm)) != NetworkEvent.Type.Empty)
            {
                if (cmd == NetworkEvent.Type.Connect)
                {
                    // When we get the connect message we can start sending data to the server
                    // Set the ping id to a sequence number for the new ping we are about to send
                    pendingPings[0] = new PendingPing {
                        id = pingStats[0], time = fixedTime
                    };
                    // Create a 4 byte data stream which we can store our ping sequence number in
                    var pingData = new DataStreamWriter(4, Allocator.Temp);
                    pingData.Write(pingStats[0]);
                    connection[0].Send(driver, pingData);
                    pingData.Dispose();
                    // Update the number of sent pings
                    pingStats[0] = pingStats[0] + 1;
                }
                else if (cmd == NetworkEvent.Type.Data)
                {
                    // When the pong message is received we calculate the ping time and disconnect
                    pingStats[1] = (int)((fixedTime - pendingPings[0].time) * 1000);
                    connection[0].Disconnect(driver);
                    connection[0] = default(NetworkConnection);
                }
                else if (cmd == NetworkEvent.Type.Disconnect)
                {
                    // If the server disconnected us we clear out connection
                    connection[0] = default(NetworkConnection);
                }
            }
        }
Пример #19
0
        public unsafe void StartInfoQuery()
        {
            Debug.Assert(m_State == SQPClientState.Idle);
            StartTime = m_Timer.ElapsedMilliseconds;

            var writer = new DataStreamWriter(BufferSize, Allocator.Temp);
            var req    = new ChallangeRequest();

            req.ToStream(ref writer);

            writer.CopyTo(0, writer.Length, ref m_Buffer);
            m_Socket.SendTo(m_Buffer, writer.Length, SocketFlags.None, m_Server);
            m_State = SQPClientState.WaitingForChallange;
            writer.Dispose();
        }
Пример #20
0
        unsafe void SendServerInfoQuery()
        {
            StartTime = m_Timer.ElapsedMilliseconds;
            var req = new QueryRequest();

            req.Header.ChallangeId = ChallangeId;
            req.RequestedChunks    = (byte)SQPChunkType.ServerInfo;

            var writer = new DataStreamWriter(BufferSize, Allocator.Temp);

            req.ToStream(ref writer);

            m_State = SQPClientState.WaitingForResponse;
            writer.CopyTo(0, writer.Length, ref m_Buffer);
            m_Socket.SendTo(m_Buffer, writer.Length, SocketFlags.None, m_Server);
            writer.Dispose();
        }
Пример #21
0
            public void Execute(int i)
            {
                DataStreamReader strmReader;

                // Data
                if (driver.PopEventForConnection(connections[i], out strmReader) != NetworkEvent.Type.Data)
                {
                    throw new InvalidOperationException("Expected data: " + i);
                }
                var ctx        = default(DataStreamReader.Context);
                int result     = strmReader.ReadInt(ref ctx);
                var strmWriter = new DataStreamWriter(4, Allocator.Temp);

                strmWriter.Write(result + 1);
                driver.Send(connections[i], strmWriter);
                strmWriter.Dispose();
            }
Пример #22
0
        void SendServerInfoQuery(SQPQuery q)
        {
            q.StartTime = NetworkUtils.stopwatch.ElapsedMilliseconds;
            var req = new QueryRequest();

            req.Header.ChallangeId = q.ChallangeId;
            req.RequestedChunks    = (byte)SQPChunkType.ServerInfo;

            var writer = new DataStreamWriter(m_Buffer.Length, Unity.Collections.Allocator.Temp);

            req.ToStream(ref writer);

            q.m_State = SQPClientState.WaitingForResponse;
            writer.CopyTo(0, writer.Length, ref m_Buffer);
            m_Socket.SendTo(m_Buffer, writer.Length, SocketFlags.None, q.m_Server);
            writer.Dispose();
        }
Пример #23
0
        internal void BrodcastRpc(byte componentIndex, byte methodId, DataStreamWriter rpcPacket, QosType qosType, bool important)
        {
            if (!isSyncComplete)
            {
                return;
            }
            var writer = new DataStreamWriter(rpcPacket.Length + 9, Allocator.Temp);

            CreateRpcPacket(ref writer, ref rpcPacket, componentIndex, methodId);
            GamePacketManager.Brodcast(writer, qosType);
            //if (important) {
            //    GamePacketManager.Brodcast (writer, qosType);
            //} else {
            //    GamePacketManager.Brodcast (writer, qosType, gridId);
            //}
            writer.Dispose();
        }
        public void DisconnectTimeoutOnServer()
        {
            using (var host = new LocalDriverHelper(default(NetworkEndPoint),
                                                    new NetworkConfigParameter {
                disconnectTimeoutMS = 40
            }))
                using (var client = new LocalNetworkDriver(new NetworkConfigParameter {
                    disconnectTimeoutMS = 40
                }))
                {
                    NetworkConnection id;
                    NetworkEvent.Type popEvent = NetworkEvent.Type.Empty;
                    DataStreamReader  reader;

                    host.Host();

                    client.Connect(host.Address);
                    client.ScheduleUpdate().Complete();
                    host.Assert_GotConnectionRequest(client.LocalEndPoint(), true);

                    var stream = new DataStreamWriter(100, Allocator.Persistent);
                    for (int i = 0; i < 100; i++)
                    {
                        stream.Write((byte)i);
                    }

                    // Host sends stuff but gets nothing back, until disconnect timeout happens
                    var timeout = m_timer.ElapsedMilliseconds + 100;
                    while (m_timer.ElapsedMilliseconds < timeout)
                    {
                        host.m_LocalDriver.Send(host.ClientConnections[0], stream);
                        popEvent = host.m_LocalDriver.PopEvent(out id, out reader);
                        if (popEvent != NetworkEvent.Type.Empty)
                        {
                            break;
                        }
                        host.Update();
                    }

                    stream.Dispose();
                    Assert.AreEqual(NetworkEvent.Type.Disconnect, popEvent);
                }
        }
Пример #25
0
        public IEnumerator ServerAndClient_SendMessageWithoutReadingIt_GivesErrorOnDriverUpdate()
        {
            SetupServerAndClientAndConnectThem(0);

            //send data from client
            DataStreamWriter m_OutStream = new DataStreamWriter(16, Allocator.Persistent);

            m_OutStream.Clear();
            m_OutStream.Write(SharedConstants.ping);
            clientToServerConnection.Send(client_driver, m_OutStream);
            m_OutStream.Dispose();

            server_driver.ScheduleUpdate().Complete();
            client_driver.ScheduleUpdate().Complete();

            LogAssert.Expect(LogType.Error, "Resetting event queue with pending events (Count=1, ConnectionID=0) Listening: 1");
            server_driver.ScheduleUpdate().Complete();

            DisconnectAndCleanup();
            yield return(null);
        }
Пример #26
0
        public void ReceiveInJobWorks()
        {
            var serverDriver = new LocalNetworkDriver(new NetworkDataStreamParameter {
                size = 64
            });

            serverDriver.Bind(IPCManager.Instance.CreateEndPoint());
            serverDriver.Listen();
            var clientDriver = new LocalNetworkDriver(new NetworkDataStreamParameter {
                size = 64
            });
            var clientToServer = clientDriver.Connect(serverDriver.LocalEndPoint());

            WaitForConnected(clientDriver, serverDriver, clientToServer);
            var strmWriter = new DataStreamWriter(4, Allocator.Temp);

            strmWriter.Write(42);
            clientToServer.Send(clientDriver, strmWriter);
            strmWriter.Dispose();
            clientDriver.ScheduleUpdate().Complete();

            var serverToClient = new NativeArray <NetworkConnection>(1, Allocator.TempJob);
            var result         = new NativeArray <int>(1, Allocator.TempJob);
            var recvJob        = new ReceiveJob {
                driver = serverDriver, connections = serverToClient, result = result
            };

            Assert.AreNotEqual(42, result[0]);
            var acceptJob = new AcceptJob {
                driver = serverDriver, connections = serverToClient
            };

            recvJob.Schedule(serverDriver.ScheduleUpdate(acceptJob.Schedule())).Complete();
            Assert.AreEqual(42, result[0]);

            result.Dispose();
            serverToClient.Dispose();
            clientDriver.Dispose();
            serverDriver.Dispose();
        }
Пример #27
0
        public IEnumerator ServerAndClient_SendBigMessage_OverflowsIncomingDriverBuffer()
        {
            SetupServerAndClientAndConnectThem(8);

            //send data from client
            DataStreamWriter m_OutStream = new DataStreamWriter(16, Allocator.Persistent);

            m_OutStream.Clear();
            m_OutStream.Write(SharedConstants.ping);
            clientToServerConnection.Send(client_driver, m_OutStream);

            LogAssert.Expect(LogType.Error, "Error on receive 10040");
            m_OutStream.Dispose();

            //handle sent data
            server_driver.ScheduleUpdate().Complete();
            client_driver.ScheduleUpdate().Complete();

            Assert.AreEqual(10040, server_driver.ReceiveErrorCode);

            DisconnectAndCleanup();
            yield return(null);
        }
Пример #28
0
        public void DataStremReaderIsOnlyUsableUntilUpdate()
        {
            var serverDriver = new LocalNetworkDriver(new NetworkDataStreamParameter {
                size = 64
            });

            serverDriver.Bind(IPCManager.Instance.CreateEndPoint());
            serverDriver.Listen();
            var clientDriver = new LocalNetworkDriver(new NetworkDataStreamParameter {
                size = 64
            });
            var clientToServer = clientDriver.Connect(serverDriver.LocalEndPoint());

            WaitForConnected(clientDriver, serverDriver, clientToServer);
            var strmWriter = new DataStreamWriter(4, Allocator.Temp);

            strmWriter.Write(42);
            clientToServer.Send(clientDriver, strmWriter);
            strmWriter.Dispose();
            clientDriver.ScheduleUpdate().Complete();
            var serverToClient = serverDriver.Accept();

            serverDriver.ScheduleUpdate().Complete();
            DataStreamReader strmReader;

            Assert.AreEqual(NetworkEvent.Type.Data, serverToClient.PopEvent(serverDriver, out strmReader));
            var ctx = default(DataStreamReader.Context);

            Assert.AreEqual(42, strmReader.ReadInt(ref ctx));
            ctx = default(DataStreamReader.Context);
            Assert.AreEqual(42, strmReader.ReadInt(ref ctx));
            serverDriver.ScheduleUpdate().Complete();
            ctx = default(DataStreamReader.Context);
            Assert.Throws <InvalidOperationException>(() => { strmReader.ReadInt(ref ctx); });
            clientDriver.Dispose();
            serverDriver.Dispose();
        }
Пример #29
0
        public void Execute(int i)
        {
            DataStreamReader strm;

            NetworkEvent.Type cmd;
            while ((cmd = driver.PopEventForConnection(connections[i].connection, out strm)) != NetworkEvent.Type.Empty)
            {
                if (cmd == NetworkEvent.Type.Data)
                {
                    var readerCtx = default(DataStreamReader.Context);
                    int id        = strm.ReadInt(ref readerCtx);
                    var pongData  = new DataStreamWriter(4, Allocator.Temp);
                    pongData.Write(id);
                    driver.Send(connections[i].connection, pongData);
                    pongData.Dispose();
                }
                else if (cmd == NetworkEvent.Type.Disconnect)
                {
                    connections[i] = new PingServerConnectionComponentData {
                        connection = default(NetworkConnection)
                    };
                }
            }
        }
Пример #30
0
 public void Write(DataStreamWriter writer, NetworkConnection connection)
 {
     m_Driver.Send(NetworkPipeline.Null, connection, writer);
     writer.Dispose();
 }