Beispiel #1
0
        private async Task SocketReceiveAsync()
        {
            var      address = this.LocalAddress;
            ASegment segment = null;

            try
            {
                while (true)
                {
                    segment = this.RcvPipeWriter.GetSegment();
                    var memory       = segment.GetWritableMemory(this.memoryBlockSize);
                    var socketResult = await this.socket.ReceiveAsync(address, memory);

                    if (socketResult.error != SocketError.Success)
                    {
                        if (!SocketErrorHelper.IsSocketDisabledError(socketResult.error))
                        {
                            this.DeliverException(new SocketException((int)socketResult.error));
                        }
                        else
                        {
                            this.CloseAsync().NoAwait();
                        }

                        break;
                    }

                    segment.Token = this.socket.RemoteAddress;
                    segment.WriterAdvance(socketResult.bytesTransferred);

                    this.RcvPipeWriter.WriterAdvance();
                    this.RcvPipeWriter.FlushAsync();
                    segment = null;
                }
            }
            catch (ObjectDisposedException)
            {
            }
            catch (Exception ex)
            {
                this.DeliverException(ex);
            }
            finally
            {
                this.RcvPipeWriter.Complete();
            }
        }
Beispiel #2
0
        private void OnRcvPipelineRead()
        {
            ReadDgramResult readDgramResult = RcvPipeReader.Read();

            if (readDgramResult.IsEmpty)
            {
                return;
            }

            int      count          = 0;
            bool     isReadComplete = false;
            ASegment head           = readDgramResult.Head;
            ASegment tail           = readDgramResult.Tail;
            ASegment segment        = head;

            try
            {
                while (!isReadComplete)
                {
                    this.RcvAddress = (EndPoint)segment.Token;
                    var memory = segment.GetReadableMemory();

                    var reader = new WrappedReader(new ReadOnlySequence <byte>(memory), this.Order, this.readerFlushCallback);
                    this.filterPipeline.OnTransportRead(this, ref reader);
                    reader.Flush();

                    count++;
                    if (segment == tail)
                    {
                        isReadComplete = true;
                    }
                    else
                    {
                        segment = segment.ChildSegment;
                    }
                }

                this.RcvPipeReader.ReaderAdvance(count);
                this.RcvPipeReader.ReceiveAsync();
            }
            catch (Exception e)
            {
                this.DeliverException(e);

                this.RcvPipeReader.Complete();
            }
        }
Beispiel #3
0
        private List <ASegment> margeSilence(List <ASegment> s1, List <ASegment> s2)
        {
            List <ASegment> rs = new List <ASegment>();
            int             b1 = 0, b2 = 0;
            bool            brk = false;

            ASegment m1 = new ASegment(), seg = new ASegment();

            while (b1 < s1.Count && b2 < s2.Count)
            {
                brk = false;

                for (int i = b1; i < s1.Count; i++)
                {
                    for (int j = b2; j < s2.Count; j++)
                    {
                        if (s2[j].Start < s1[i].Start)
                        {
                            if (s2[j].End <= s1[i].Start)
                            {
                                b2++;
                                continue;
                            }
                            else if (s2[j].End <= s1[i].End)
                            {
                                rs.Add(new ASegment {
                                    Start = s1[i].Start, End = s2[j].End, Duration = s2[j].End - s1[i].Start
                                });
                                if (s2[j].End < s1[i].End)
                                {
                                    s1[i].Start = s2[j].End;
                                }
                                else
                                {
                                    b1++;
                                }
                                b2++;
                                brk = true;
                                break;
                            }
                            else
                            {
                                rs.Add(new ASegment {
                                    Start = s1[i].Start, End = s1[i].End, Duration = s1[i].End - s1[i].Start
                                });
                                s2[j].Start = s1[i].End;
                                b1++;
                                brk = true;
                                break;
                            }
                        }
                        else if (s2[j].Start < s1[i].End)
                        {
                            if (s2[j].End <= s1[i].End)
                            {
                                rs.Add(new ASegment {
                                    Start = s2[j].Start, End = s2[j].End, Duration = s2[j].End - s2[j].Start
                                });
                                if (s2[j].End < s1[i].End)
                                {
                                    s1[i].Start = s2[j].End;
                                }
                                else
                                {
                                    b1++;
                                }
                                b2++;
                                brk = true;
                                break;
                            }
                            else
                            {
                                rs.Add(new ASegment {
                                    Start = s2[j].Start, End = s1[i].End, Duration = s1[i].End - s2[j].Start
                                });
                                s2[j].Start = s1[i].End;
                                b1++;
                                brk = true;
                                break;
                            }
                        }
                        else
                        {
                            b1++;
                            brk = true;
                            break;
                        }
                    }

                    if (brk)
                    {
                        break;
                    }
                }
            }

            return(rs);
        }
Beispiel #4
0
 public ReadDgramResult(ASegment headBufferSegment, ASegment tailBufferSegment)
 {
     this.IsEmpty = (headBufferSegment == null);
     this.Head    = headBufferSegment;
     this.Tail    = tailBufferSegment;
 }