Exemple #1
0
        private async Task Queue(NetworkData nd)
        {
            if (nd == null)
            {
                return;
            }
            if (nd is NetworkDataKeepAlive keepAlive)
            {
                return;
            }

            using (var messages = await messageQueue.WaitAsync())
            {
                if (waitMessage.IsWaiting())
                {
                    messages.Value.Enqueue(nd);
                    waitMessage.Signal();
                }
                else
                {
                    var onMessageReceived = OnMessageReceived;
                    if (onMessageReceived != null)
                    {
                        _ = onMessageReceived(this, nd, cancel.Token);
                    }
                    else
                    {
                        messages.Value.Enqueue(nd);
                    }
                }
            }
        }
Exemple #2
0
        private async Task SendLoop()
        {
            byte[]      b = new byte[6000];
            NetworkData nd;
            int         index = 0;

            while (true)
            {
                await Task.Delay(100, cancel.Token);

                using (var l = await sendQueue.WaitAsync())
                {
                    while (l.Value.TryDequeue(out nd) && index < 64000)
                    {
                        byte[] buf = nd.GetBytes();
                        if (buf.Length > b.Length - index)
                        {
                            byte[] c = new byte[buf.Length * 4 + b.Length];
                            Buffer.BlockCopy(b, 0, c, 0, index);
                            b = c;
                        }
                        Buffer.BlockCopy(buf, 0, b, index, buf.Length);
                        index += buf.Length;
                    }
                }

                if (index > 0)
                {
                    try
                    {
                        await ns.WriteAsync(b, 0, index, cancel.Token);

                        index = 0;
                    }
                    catch (IOException) { Close(); };
                }
            }
        }