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); } }); }
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(); }
public UdpClient(UdpServer udpserver, EndPoint remoteendpoint) { mremoteEP = remoteendpoint; mudpserver = udpserver; }
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); } }); }
public UdpChannelManager(UdpServer udpserver, EndPoint remoteendpoint) : base(udpserver, remoteendpoint) { unreliabledatareceiveddelegate += unreliabledatareceivedcallback; reliabledatareceiveddelegate += reliabledatareceivedcallback; OnchannelReceivedatacallbackmap = new Dictionary <ChannelidType, UdpChannel>(); }