Exemplo n.º 1
0
        public void TestKCP()
        {
            ///发送次数
            const int echoTimes = 3;
            Random    random    = new Random();

            var handle1 = new Handle();
            var handle2 = new Handle();

            const int conv = 123;
            var       kcp1 = new Kcp(conv, handle1);
            var       kcp2 = new Kcp(conv, handle2);

            ///kcp设置
            ///https://github.com/skywind3000/kcp/issues/39#issuecomment-244592173
            kcp1.NoDelay(1, 10, 2, 1);//fast
            kcp1.WndSize(64, 64);
            kcp1.SetMtu(512);

            kcp2.NoDelay(1, 10, 2, 1);//fast
            kcp2.WndSize(64, 64);
            kcp2.SetMtu(512);

            var sendbyte = Encoding.ASCII.GetBytes(message);

            handle1.Out += buffer =>
            {
                var next = random.Next(100);
                if (next >= 5)///随机丢包
                {
                    kcp2.Input(buffer);
                }
            };

            handle2.Out += buffer =>
            {
                kcp1.Input(buffer);
            };

            int end = 0;

            handle1.Recv += buffer =>
            {
                unsafe
                {
                    using (MemoryHandle p = buffer.Memory.Pin())
                    {
                        var str = Encoding.ASCII.GetString((byte *)p.Pointer, buffer.Memory.Length);
                        Assert.AreEqual(message, str);
                        Interlocked.Increment(ref end);
                        //Assert.Warn($"echo {end}");
                        if (end < echoTimes)
                        {
                            kcp1.Send(buffer.Memory.Span);
                        }
                    }
                }
            };

            handle2.Recv += buffer =>
            {
                kcp2.Send(buffer.Memory.Span);
            };

            Task.Run(async() =>
            {
                try
                {
                    while (true)
                    {
                        kcp1.Update(DateTime.UtcNow);
                        int len;
                        while ((len = kcp1.PeekSize()) > 0)
                        {
                            var buffer = kcp1.CreateBuffer(len);
                            if (kcp1.Recv(buffer.Memory.Span) >= 0)
                            {
                                handle1.Receive(buffer);
                            }
                        }
                        await Task.Delay(5);
                    }
                }
                catch (Exception e)
                {
                    e.ToString();
                }
            });

            Task.Run(async() =>
            {
                try
                {
                    while (true)
                    {
                        kcp2.Update(DateTime.UtcNow);
                        int len;
                        //while ((len = kcp2.PeekSize()) > 0)
                        //{
                        //    var buffer = kcp2.CreateBuffer(len);
                        //    if (kcp2.Recv(buffer.Memory.Span) >= 0)
                        //    {
                        //        handle2.Receive(buffer);
                        //    }
                        //}

                        do
                        {
                            var(buffer, avalidSzie) = kcp2.TryRecv();
                            len = avalidSzie;
                            if (buffer != null)
                            {
                                handle2.Receive(buffer);
                            }
                        } while (len > 0);

                        await Task.Delay(5);
                    }
                }
                catch (Exception e)
                {
                    e.ToString();
                }
            });

            kcp1.Send(sendbyte);

            var task = Task.Run(async() =>
            {
                while (end < echoTimes)
                {
                    await Task.Yield();
                }
                return(1);
            });

            task.Result.ToString();
        }
Exemplo n.º 2
0
        static void Main(string[] args)
        {
            Console.WriteLine(ShowThread);
            Random random = new Random();

            var handle1 = new Handle();
            var handle2 = new Handle();

            const int conv = 123;
            var       kcp1 = new Kcp(conv, handle1);
            var       kcp2 = new Kcp(conv, handle2);

            kcp1.NoDelay(1, 10, 2, 1);//fast
            kcp1.WndSize(64, 64);
            kcp1.SetMtu(512);

            kcp2.NoDelay(1, 10, 2, 1);//fast
            kcp2.WndSize(64, 64);
            kcp2.SetMtu(512);

            var sendbyte = Encoding.ASCII.GetBytes(TestClass.message);

            handle1.Out += buffer =>
            {
                var next = random.Next(100);
                if (next >= 15)///随机丢包
                {
                    //Console.WriteLine($"11------Thread[{Thread.CurrentThread.ManagedThreadId}]");
                    Task.Run(() =>
                    {
                        //Console.WriteLine($"12------Thread[{Thread.CurrentThread.ManagedThreadId}]");
                        kcp2.Input(buffer);
                    });
                }
                else
                {
                    //Console.WriteLine("Send miss");
                }
            };

            handle2.Out += buffer =>
            {
                var next = random.Next(100);
                if (next >= 0)///随机丢包
                {
                    Task.Run(() =>
                    {
                        kcp1.Input(buffer);
                    });
                }
                else
                {
                    Console.WriteLine("Resp miss");
                }
            };
            int count = 0;

            handle1.Recv += buffer =>
            {
                unsafe
                {
                    using (MemoryHandle p = buffer.Memory.Pin())
                    {
                        var str = Encoding.ASCII.GetString((byte *)p.Pointer, buffer.Memory.Length);
                        count++;
                        if (TestClass.message == str)
                        {
                            Console.WriteLine($"kcp  echo----{count}");
                        }
                        var res = kcp1.Send(buffer.Memory.Span);
                        if (res != 0)
                        {
                            Console.WriteLine($"kcp send error");
                        }
                    }
                }
            };

            int recvCount = 0;

            handle2.Recv += buffer =>
            {
                recvCount++;
                Console.WriteLine($"kcp2 recv----{recvCount}");
                var res = kcp2.Send(buffer.Memory.Span);
                if (res != 0)
                {
                    Console.WriteLine($"kcp send error");
                }
            };

            Task.Run(async() =>
            {
                try
                {
                    int updateCount = 0;
                    while (true)
                    {
                        kcp1.Update(DateTime.UtcNow);

                        int len;
                        while ((len = kcp1.PeekSize()) > 0)
                        {
                            var buffer = kcp1.CreateBuffer(len);
                            if (kcp1.Recv(buffer.Memory.Span) >= 0)
                            {
                                handle1.Receive(buffer);
                            }
                        }

                        await Task.Delay(5);
                        updateCount++;
                        if (updateCount % 1000 == 0)
                        {
                            Console.WriteLine($"KCP1 ALIVE {updateCount}----{ShowThread}");
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            });

            Task.Run(async() =>
            {
                try
                {
                    int updateCount = 0;
                    while (true)
                    {
                        kcp2.Update(DateTime.UtcNow);

                        //var utcNow = DateTime.UtcNow;
                        //var res = kcp2.Check(utcNow);

                        int len;
                        do
                        {
                            var(buffer, avalidSzie) = kcp2.TryRecv();
                            len = avalidSzie;
                            if (buffer != null)
                            {
                                handle2.Receive(buffer);
                            }
                        } while (len > 0);

                        await Task.Delay(5);
                        updateCount++;
                        if (updateCount % 1000 == 0)
                        {
                            Console.WriteLine($"KCP2 ALIVE {updateCount}----{ShowThread}");
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            });

            kcp1.Send(sendbyte);

            while (true)
            {
                Thread.Sleep(1000);
                GC.Collect();
            }

            Console.ReadLine();
        }