Exemple #1
0
        public static void LogTonkStatus(SDKConnection connection)
        {
            Tonk.Status   status   = connection.GetStatus();
            Tonk.StatusEx statusEx = connection.GetStatusEx();

            StringBuilder sb = new StringBuilder();

            sb.Append("tonk_status: ");
            if (status.Flags.HasFlag(Tonk.Flags.Initiated))
            {
                sb.Append("Initiated ");
            }
            if (status.Flags.HasFlag(Tonk.Flags.TimeSync))
            {
                sb.Append("TimeSync ");
            }
            if (status.Flags.HasFlag(Tonk.Flags.NATMap_Local))
            {
                sb.Append("NATMap_Local ");
            }
            if (status.Flags.HasFlag(Tonk.Flags.NATMap_Remote))
            {
                sb.Append("NATMap_Remote ");
            }
            if (status.Flags.HasFlag(Tonk.Flags.Connecting))
            {
                sb.Append("Connecting ");
            }
            if (status.Flags.HasFlag(Tonk.Flags.Connected))
            {
                sb.Append("Connected ");
            }
            if (status.Flags.HasFlag(Tonk.Flags.Disconnected))
            {
                sb.Append("Disconnected ");
            }
            sb.AppendFormat(" RemoteId={0}", status.LocallyAssignedIdForRemoteHost);
            sb.AppendFormat(" AppBPS={0}", status.AppBPS);
            sb.AppendFormat(" ReliableQueueMsec={0}", status.ReliableQueueMsec);
            sb.AppendFormat(" LowPriQueueMsec={0}", status.LowPriQueueMsec);

            sb.AppendFormat(" ConnectionKey={0}", statusEx.ConnectionKey.ToString("X4"));
            sb.AppendFormat(" Local={0}", statusEx.Local.ToString());
            sb.AppendFormat(" Remote={0}", statusEx.Remote.ToString());
            sb.AppendFormat(" LocalNATPort={0}", statusEx.LocalNATMapExternalPort);
            sb.AppendFormat(" RemoteNATPort={0}", statusEx.RemoteNATMapExternalPort);
            sb.AppendFormat(" LocalId={0}", statusEx.RemoteAssignedIdForLocalHost);
            sb.AppendFormat(" PeerSeenBPS={0}", statusEx.PeerSeenBPS);
            sb.AppendFormat(" PeerSeenLossRate={0}", statusEx.PeerSeenLossRate);
            sb.AppendFormat(" PeerTripUsec={0}", statusEx.PeerTripUsec);
            sb.AppendFormat(" IncomingBPS={0}", statusEx.IncomingBPS);
            sb.AppendFormat(" PLR={0}", statusEx.IncomingLossRate);
            sb.AppendFormat(" TripUsec={0}", statusEx.TripUsec);

            Console.WriteLine(sb);
        }
Exemple #2
0
        public override void OnTick(ulong nowUsec)
        {
            Tonk.Status status = GetStatus();

            if (++StatusLogCounter >= 100)
            {
                StatusLogCounter = 0;
                TestTools.LogTonkStatus(this);

                if (status.Flags.HasFlag(Tonk.Flags.TimeSync))
                {
                    if (!Client.StartedP2PConnection)
                    {
                        // Tell server we want to connect to another peer
                        byte[] data = new byte[1];
                        data[0] = Constants.ID_P2PConnectionStart;
                        Send(data);
                    }
                }
            }

            if (Constants.TONK_ENABLE_1MBPS_DATA)
            {
                if (status.Flags.HasFlag(Tonk.Flags.TimeSync))
                {
                    byte[] data = new byte[1 + 2 + 3 + 1300 - 4];

                    for (int i = 0; i < data.Length; ++i)
                    {
                        data[i] = (byte)i;
                    }

                    UInt16 ts16 = ToRemoteTime16(nowUsec);
                    UInt32 ts23 = ToRemoteTime23(nowUsec);

                    data[0] = 1;
                    unsafe
                    {
                        fixed(byte *ptr = data)
                        {
                            Tonk.WriteU16_LE(ptr + 1, ts16);
                            Tonk.WriteU24_LE(ptr + 1 + 2, ts23);
                            Tonk.WriteU24_LE(ptr + 1 + 2 + 3, 0x123456);
                            Tonk.WriteU32_LE(ptr + 1 + 2 + 3 + 3, MBCounter++);
                        }
                    }

                    Send(data);
                }
            }

            // Test destroying the object before app shuts down.
            // Ensure that GC collects the SDKConnection object shortly after this.
            //Close();
        }
Exemple #3
0
        public override void OnConnect()
        {
            TestTools.LogTonkStatus(this);

            Tonk.Status status = GetStatus();

            List <MyServerConnection> connections = Server.GetConnections();

            connections.ForEach(connection =>
            {
                Tonk.Status cs = connection.GetStatus();

                // Send other clients info about connecting client
                if (connection != this)
                {
                    Console.WriteLine("Broadcasting connection {0} about {1} connecting", cs.LocallyAssignedIdForRemoteHost,
                                      status.LocallyAssignedIdForRemoteHost);

                    byte[] assignIdMsg = new byte[1 + 4];
                    unsafe
                    {
                        fixed(byte *ptr = assignIdMsg)
                        {
                            ptr[0] = Constants.ID_ConnectionAdded;
                            Tonk.WriteU32_LE(ptr + 1, status.LocallyAssignedIdForRemoteHost);
                        }
                    }
                    connection.Send(assignIdMsg);
                }

                // Send connecting client info about other clients
                byte[] userListIdMsg = new byte[1 + 4];
                unsafe
                {
                    fixed(byte *ptr = userListIdMsg)
                    {
                        ptr[0] = Constants.ID_ConnectionAdded;
                        Tonk.WriteU32_LE(ptr + 1, cs.LocallyAssignedIdForRemoteHost);
                    }
                }
                Send(userListIdMsg);
            });
        }
Exemple #4
0
        public override void OnTick(ulong nowUsec)
        {
            Tonk.Status status = GetStatus();

            if (++StatusLogCounter >= 100)
            {
                StatusLogCounter = 0;
                TestTools.LogTonkStatus(this);
            }

            if (Constants.TONK_ENABLE_1MBPS_DATA)
            {
                if (status.Flags.HasFlag(Tonk.Flags.TimeSync))
                {
                    byte[] data = new byte[1 + 2 + 3 + 1300 - 4];

                    for (int i = 0; i < data.Length; ++i)
                    {
                        data[i] = (byte)i;
                    }

                    UInt16 ts16 = ToRemoteTime16(nowUsec);
                    UInt32 ts23 = ToRemoteTime23(nowUsec);

                    unsafe
                    {
                        fixed(byte *ptr = data)
                        {
                            ptr[0] = 1;
                            Tonk.WriteU16_LE(ptr + 1, ts16);
                            Tonk.WriteU24_LE(ptr + 1 + 2, ts23);
                            Tonk.WriteU24_LE(ptr + 1 + 2 + 3, 0x123456);
                            Tonk.WriteU32_LE(ptr + 1 + 2 + 3 + 3, MBCounter++);
                        }
                    }

                    Send(data);
                }
            }
        }
Exemple #5
0
        public override unsafe void OnData(uint channel, byte *data, uint bytes)
        {
            if (bytes <= 0)
            {
                return;
            }

            if (data[0] == 1)
            {
                UInt16 ts16  = Tonk.ReadU16_LE(data + 1);
                UInt32 ts23  = Tonk.ReadU24_LE(data + 1 + 2);
                UInt64 lo16  = FromLocalTime16(ts16);
                UInt64 lo23  = FromLocalTime23(ts23);
                UInt32 magic = Tonk.ReadU24_LE(data + 1 + 2 + 3);
                Debug.Assert(magic == 0x123456);
                UInt32 packetIndex = Tonk.ReadU32_LE(data + 1 + 2 + 3 + 3);

                UInt64 nowUsec = Tonk.tonk_time();
                UInt64 owdUsec = nowUsec - lo23;
                OWDStats.AddSample(owdUsec);
                if (++OWDStatsInterval >= Constants.OWDStatsInterval)
                {
                    OWDStatsInterval = 0;
                    Console.WriteLine("DATA RESULT: Transmission time (acc=16) = {0}, (acc=23) = {1} # {2}", (int)(nowUsec - lo16), (int)(nowUsec - lo23), packetIndex);
                    OWDStats.PrintStatistics();
                }

                return;
            }
            if (data[0] == Constants.ID_P2PConnectionStart)
            {
                P2PRequested = true;

                Tonk.Status statusBob = GetStatus();

                List <MyServerConnection> connections = Server.GetConnections();
                connections.ForEach(connection =>
                {
                    // If there is a second connection that also requested P2P:
                    if (connection != this && connection.P2PRequested)
                    {
                        Tonk.Status statusAlice = connection.GetStatus();

                        Console.WriteLine("Connecting Alice({0}) and Bob({1})",
                                          statusAlice.LocallyAssignedIdForRemoteHost,
                                          statusBob.LocallyAssignedIdForRemoteHost);

                        SDKResult result = P2PConnect(connection);
                        if (result.Failed())
                        {
                            Console.WriteLine("P2PConnect failed: {0}", result);
                        }
                    }
                });
                return;
            }
            if (data[0] == Constants.ID_ConnectionRebroadcast)
            {
                Tonk.Status status = GetStatus();

                string origMsg = Marshal.PtrToStringAnsi((IntPtr)data + 1);
                Console.WriteLine("Rebroadcast request from {0} = `{1}`", status.LocallyAssignedIdForRemoteHost, origMsg);

                byte[] broadcastMsg = new byte[3 + bytes];
                unsafe
                {
                    fixed(byte *ptr = broadcastMsg)
                    {
                        ptr[0] = Constants.ID_ConnectionRebroadcast;
                        Tonk.WriteU24_LE(ptr + 1, status.LocallyAssignedIdForRemoteHost);
                        for (int i = 1; i < bytes; ++i)
                        {
                            ptr[i + 3] = data[i];
                        }
                    }
                }

                List <MyServerConnection> connections = Server.GetConnections();
                connections.ForEach(connection =>
                {
                    // If there is a second connection that also requested P2P:
                    if (connection != this)
                    {
                        connection.Send(broadcastMsg, 1);
                    }
                });
                return;
            }
            if (data[0] == Constants.ID_PreConnectDataTest)
            {
                Console.WriteLine("Got pre-connect data test");

                bool validated = TestTools.ValidatePreconnectData(channel, data, bytes);
                if (!validated)
                {
                    Console.WriteLine("ERROR: Preconnect data was invalid!");
                    Debug.Assert(false);
                }
                return;
            }

            Console.WriteLine("Got ", bytes, " bytes of message data unexpected type ", (int)data[0]);
            Debug.Assert(false);
        }