コード例 #1
0
        public KcpClient(UdpServer udpserver, EndPoint remoteendpoint) : base(udpserver, remoteendpoint)
        {
#if LOOPBACKTEST
            onUserLevelReceivedCompleted += (ref byte[] buffer) => {
#if UTF16
                var str = System.Text.Encoding.Unicode.GetString(buffer);
#else
                var str = System.Text.Encoding.UTF8.GetString(buffer);
#endif
                Console.ForegroundColor = ConsoleColor.Blue;
                Console.WriteLine(str);
                Console.ForegroundColor = ConsoleColor.White;
                userlevelsend(ref buffer);
            };
#endif
            kcphandle handle = new kcphandle();
            OnReceivedCompletePointer = (ref byte[] buffer) => {
                mKcp.Input(buffer);//buffer is received from low level data
            };
            handle.Out = buffer => {
                mudpserver.UdpListener.SendTo(buffer.ToArray(), mremoteEP);//low level send
            };
            mKcp = new Kcp((uint)(5598781), handle);
            mKcp.NoDelay(1, 5, 2, 1);//fast
            mKcp.WndSize(64, 64);
            mKcp.SetMtu(512);
            Task.Run(async() =>
            {
                try
                {
                    int updateCount = 0;
                    while (true)
                    {
                        mKcp.Update(DateTime.UtcNow);

                        int len;
                        while ((len = mKcp.PeekSize()) > 0)
                        {
                            var buffer = new byte[len];
                            if (mKcp.Recv(buffer) >= 0)
                            {
                                onUserLevelReceivedCompleted.Invoke(ref buffer);
                            }
                        }
                        await Task.Delay(1);
                        updateCount++;
                        if (updateCount % 1000 == 0)
                        {
                            Console.WriteLine($"KCP ALIVE {updateCount}----");
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            });
        }
コード例 #2
0
        public SuperUdpClient(UdpServer udpserver, EndPoint remoteendpoint)
        {
            Queuedreliabledata = new Queue <byte[]>();
            mudpclient         = new UdpClient(udpserver, remoteendpoint);
            mudpclient.OnReceivedCompletePointer = (ref byte[] buffer) => {
                if (isvalidedata(ref buffer))
                {
                    //int datasize = buffer.Length;
                    int  headersize      = header.Count;
                    byte un_reliablebyte = buffer[headersize];
                    if (un_reliablebyte == UNRELIABLESIGN)
                    {
                        byte normal_ackbyte = buffer[headersize + 1];
                        if (normal_ackbyte == NORMALDATASIGN)
                        {
                            int    commandsize = headersize + 1 + 1;
                            int    playloadsize;                                                       //= datasize - commandsize;
                            byte[] sizebyte = new byte[2];
                            Array.ConstrainedCopy(buffer, commandsize, sizebyte, 0, 2);                //here is 2 byte valide data length
                            playloadsize = ByteArraytoUint16.DeSerialize(ref sizebyte);                //here is 2 byte valide data length
                            realdata     = new byte[playloadsize];
                            Array.ConstrainedCopy(buffer, commandsize + 2, realdata, 0, playloadsize); //here is 2 byte valide data length

                            unreliabledatareceiveddelegate.Invoke(ref realdata);
                        }
                        else if (normal_ackbyte == ACKSIGN)
                        {
                            receiveackid = buffer[headersize + 2];
                            //Console.WriteLine("receiveackid"+ receiveackid);
                        }
                    }
                    else if (un_reliablebyte == RELIABLESIGN)
                    {
                        byte messageid = buffer[headersize + 1];
                        bool bspecial  = messageid == 0 && lastsendackid == 0xff;
                        if (bspecial || messageid > lastsendackid)
                        {
                            lastsendackid = messageid;
                            //+ reliable  + id
                            int    commandsize = headersize + 1 + +1;
                            int    playloadsize;                                                       //= datasize - commandsize;
                            byte[] sizebyte = new byte[2];
                            Array.ConstrainedCopy(buffer, commandsize, sizebyte, 0, 2);                //here is 2 byte valide data length
                            playloadsize = ByteArraytoUint16.DeSerialize(ref sizebyte);                //here is 2 byte valide data length
                            realdata     = new byte[playloadsize];
                            Array.ConstrainedCopy(buffer, commandsize + 2, realdata, 0, playloadsize); //here is 2 byte valide data length

                            reliabledatareceiveddelegate.Invoke(ref realdata);
                        }
                        sendack(messageid);
                    }
                }
            };
            Thread TransferListenerthread = new Thread(reliabletickwork);

            TransferListenerthread.IsBackground = true;
            TransferListenerthread.Start();
        }
コード例 #3
0
 public UdpClient(UdpServer udpserver, EndPoint remoteendpoint)
 {
     mremoteEP  = remoteendpoint;
     mudpserver = udpserver;
 }
コード例 #4
0
        public KcpClient(UdpServer udpserver, EndPoint remoteendpoint) : base(udpserver, remoteendpoint)
        {
#if LOOPBACKTEST
            onUserLevelReceivedCompleted += (ref byte[] buffer) => {
                byte[] idbuffer = new byte[KcpChannel.idlength];
                Array.ConstrainedCopy(buffer, 0, idbuffer, 0, 32);
#if UTF16
                var idstr = System.Text.Encoding.Unicode.GetString(idbuffer);
#else
                var idstr = System.Text.Encoding.UTF8.GetString(idbuffer);
#endif
                bool bcontain = KcpChannelManager.OnchannelReceivedatacallbackmap.ContainsKey(idstr);
                if (bcontain)
                {
                    if (KcpChannelManager.OnchannelReceivedatacallbackmap[idstr].mkcpclient.mremoteEP == mremoteEP)
                    {
                    }
                    else
                    {
                        // KcpChannelManager.OnchannelReceivedatacallbackmap[idstr].mkcpclient.mremoteEP = mremoteEP;

                        KcpChannelManager.OnchannelReceivedatacallbackmap.Remove(idstr);
                        KcpChannelManager.OnchannelReceivedatacallbackmap.Add(idstr, new KcpChannel(idstr, this));//need verify
                    }
                }
                else
                {
                    KcpChannelManager.OnchannelReceivedatacallbackmap.Add(idstr, new KcpChannel(idstr, this));
                }
                int    datasize   = buffer.Length - KcpChannel.idlength;
                byte[] databuffer = new byte[datasize];
                Array.ConstrainedCopy(buffer, KcpChannel.idlength, databuffer, 0, datasize);
                KcpChannelManager.OnchannelReceivedatacallbackmap[idstr].Onreceivedata(ref databuffer);

                #region
                //byte[] latitudebuffer = new byte[4];
                //Array.ConstrainedCopy(buffer, 32, latitudebuffer, 0, 4);
                //float latitude = ByteArraytoChannelidType.DeSerialize(ref latitudebuffer);

                //byte[] longitudebuffer = new byte[4];
                //Array.ConstrainedCopy(buffer, 32+4, longitudebuffer, 0, 4);
                //float longitude = ByteArraytoChannelidType.DeSerialize(ref longitudebuffer);

                //Console.ForegroundColor = ConsoleColor.Blue;
                //Console.WriteLine(idstr);
                //Console.WriteLine(latitude.ToString());
                //Console.WriteLine(longitude.ToString());
                //Console.ForegroundColor = ConsoleColor.White;
                //userlevelsend(ref buffer);
                #endregion
            };
#endif
            kcphandle handle = new kcphandle();
            OnReceivedCompletePointer = (ref byte[] buffer) => {
                mKcp.Input(buffer);//buffer is received from low level data
            };
            handle.Out = buffer => {
                mudpserver.UdpListener.SendTo(buffer.ToArray(), mremoteEP);//low level send
            };
            mKcp = new Kcp((uint)(5598781), handle);
            mKcp.NoDelay(1, 5, 2, 1);//fast
            mKcp.WndSize(64, 64);
            mKcp.SetMtu(512);
            Task.Run(async() =>
            {
                try
                {
                    int updateCount = 0;
                    while (true)
                    {
                        mKcp.Update(DateTime.UtcNow);

                        int len;
                        while ((len = mKcp.PeekSize()) > 0)
                        {
                            var buffer = new byte[len];
                            if (mKcp.Recv(buffer) >= 0)
                            {
                                onUserLevelReceivedCompleted.Invoke(ref buffer);
                            }
                        }
                        await Task.Delay(1);
                        updateCount++;
                        if (updateCount % 1000 == 0)
                        {
                            Console.WriteLine($"KCP ALIVE {updateCount}----");
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            });
        }
コード例 #5
0
 public UdpChannelManager(UdpServer udpserver, EndPoint remoteendpoint) : base(udpserver, remoteendpoint)
 {
     unreliabledatareceiveddelegate += unreliabledatareceivedcallback;
     reliabledatareceiveddelegate   += reliabledatareceivedcallback;
     OnchannelReceivedatacallbackmap = new Dictionary <ChannelidType, UdpChannel>();
 }