示例#1
0
        private async void SendLoop()
        {
            SendPacket packet = null;

            while (Parent.State == State.Connected)
            {
                packet = null;
                lock (SendBuffer.SyncRoot)
                {
                    if (SendBuffer.Count == 0)
                    {
                        IsSending = false;
                        return;
                    }
                    packet = SendBuffer.PopFront();
                }

                byte[] dataToSend = null;
                try
                {
                    dataToSend = packet.GetDataToSend(Parent.BufferSize, Parent.LegacySupport);
                }
                catch (Exception ex)
                {
                    Parent.OnErrorReceived(Parent, ex.AsEventArgs());
                    break;
                }

                if (dataToSend == null)
                {
                    continue;
                }

                try
                {
                    if (Parent.Protocol == Protocol.Tcp)
                    {
                        await socketStream.WriteAsync(dataToSend, 0, dataToSend.Length);

                        packet.TotalSent += dataToSend.Length;
                    }
                    else // UDP
                    {
                        packet.TotalSent += await socket.SendToAsync(dataToSend, 0, dataToSend.Length, SocketFlags.None, packet.Destination);
                    }
                }
                catch (Exception ex)
                {
                    Parent.OnErrorReceived(Parent, ex.AsEventArgs());
                    break;
                }

                if (!packet.SendCompleted)
                {
                    lock (SendBuffer.SyncRoot)
                        SendBuffer.PushFront(packet);
                }
                Parent.OnSendProgress(Parent, new SendProgressEventArgs(packet, dataToSend.Length));
            }
            lock (SendBuffer.SyncRoot)
                IsSending = false;
        }