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();
            }
        }