| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 | using System;using System.Buffers;using System.Net;using System.Net.Sockets;using System.Net.Sockets.Kcp;using System.Threading;using System.Threading.Tasks;using Fort23.UTool;public class UDPForKCP : IKcpCallback, IDisposable{    private UdpClient client;    private Thread _udpClientThread;    public int myPort;    public int ycPort;    public bool isLockSend;    public object LockObject;    public bool isConnect;    // public int PiPeiPort;    public UDPForKCP()    {    }    public UDPForKCP(int port, uint conv) : this(port, null, conv)    {    }    public UDPForKCP(int port, IPEndPoint endPoint, uint conv)    {        myPort = port;        // LogTool.Log("链接端口"+port+"__"+endPoint.Address);        client = new UdpClient(port);        if (endPoint != null)        {            client.Connect(endPoint);            isConnect = true;        }        _kcp = new SimpleSegManager.Kcp(conv, this);        kcp.NoDelay(1, 40, 2, 0);        this.EndPoint = endPoint;        _udpClientThread = new Thread(BeginRecv);        _udpClientThread.Start();    }    public SimpleSegManager.Kcp kcp    {        get { return _kcp; }    }    public IPEndPoint EndPoint { get; set; }    private SimpleSegManager.Kcp _kcp;    public void Output(IMemoryOwner<byte> buffer, int avalidLength)    {        if (EndPoint == null)        {            return;        }        var s = buffer.Memory.Span.Slice(0, avalidLength).ToArray();        if (isLockSend)        {            lock (LockObject)            {                client.Send(s, s.Length, EndPoint);                // Debug.Log("发送"+client.Client.RemoteEndPoint);                buffer.Dispose();            }        }        else        {            // Debug.Log("发送"+client.Client.RemoteEndPoint!=null);            if (isConnect)            {                client.Send(s, s.Length);            }            else            {                client.Send(s, s.Length, EndPoint);            }            buffer.Dispose();        }    }    public async void SendAsync(byte[] datagram, int bytes)    {        int c = kcp.Send(datagram.AsSpan().Slice(0, bytes));        // LogTool.Error("发送错误" + c);    }    public byte[] ReceiveAsync()    {        var (buffer, avalidLength) = kcp.TryRecv();        while (buffer == null)        {            Thread.Sleep(5);            if (_udpClientThread == null)            {                return null;            }            (buffer, avalidLength) = kcp.TryRecv();        }        var s = buffer.Memory.Span.Slice(0, avalidLength).ToArray();        return s;    }    private async void BeginRecv()    {        while (_udpClientThread != null)        {            try            {                var res = await client.ReceiveAsync();                int ok = kcp.Input(res.Buffer);                if (ok >= 0)                {                    EndPoint = res.RemoteEndPoint;                    ycPort = EndPoint.Port;                }                else                {                    LogTool.Error("kcp.Receive 返回错误" + ok+"___"+res.RemoteEndPoint);                }                           }            catch (Exception e)            {                SocketException socketException = e as SocketException;                if (socketException.ErrorCode == 10054)                {                }                LogTool.Error(e);            }            Thread.Sleep(1);        }    }    public void Dispose()    {        _udpClientThread = null;        client?.Dispose();        kcp?.Dispose();        client = null;        _kcp = null;    }}
 |