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(); } }
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(); } }
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); }
public ReadDgramResult(ASegment headBufferSegment, ASegment tailBufferSegment) { this.IsEmpty = (headBufferSegment == null); this.Head = headBufferSegment; this.Tail = tailBufferSegment; }