public override void FinishRead(SocketChannelAsyncOperation operation) { Contract.Assert(this.channel.EventLoop.InEventLoop); TcpServerSocketChannel ch = this.Channel; if ((ch.ResetState(StateFlags.ReadScheduled) & StateFlags.Active) == 0) { return; // read was signaled as a result of channel closure } IChannelConfiguration config = ch.Configuration; IChannelPipeline pipeline = ch.Pipeline; IRecvByteBufAllocatorHandle allocHandle = this.Channel.Unsafe.RecvBufAllocHandle; allocHandle.Reset(config); bool closed = false; Exception exception = null; try { Socket connectedSocket = null; try { connectedSocket = operation.AcceptSocket; operation.AcceptSocket = null; operation.Validate(); var message = this.PrepareChannel(connectedSocket); connectedSocket = null; ch.ReadPending = false; pipeline.FireChannelRead(message); allocHandle.IncMessagesRead(1); if (!config.AutoRead && !ch.ReadPending) { // ChannelConfig.setAutoRead(false) was called in the meantime. // Completed Accept has to be processed though. return; } while (allocHandle.ContinueReading()) { connectedSocket = ch.Socket.Accept(); message = this.PrepareChannel(connectedSocket); connectedSocket = null; ch.ReadPending = false; pipeline.FireChannelRead(message); allocHandle.IncMessagesRead(1); } } catch (SocketException ex) when(ex.SocketErrorCode == SocketError.OperationAborted || ex.SocketErrorCode == SocketError.InvalidArgument) { closed = true; } catch (SocketException ex) when(ex.SocketErrorCode == SocketError.WouldBlock) { } catch (SocketException ex) { // socket exceptions here are internal to channel's operation and should not go through the pipeline // especially as they have no effect on overall channel's operation Logger.Info("Exception on accept.", ex); } catch (ObjectDisposedException) { closed = true; } catch (Exception ex) { exception = ex; } allocHandle.ReadComplete(); pipeline.FireChannelReadComplete(); if (exception != null) { // ServerChannel should not be closed even on SocketException because it can often continue // accepting incoming connections. (e.g. too many open files) pipeline.FireExceptionCaught(exception); } if (closed && ch.Open) { this.CloseSafe(); } } finally { // Check if there is a readPending which was not processed yet. if (!closed && (ch.ReadPending || config.AutoRead)) { ch.DoBeginRead(); } } }
public TcpServerSocketChannelConfig(TcpServerSocketChannel channel, Socket javaSocket) : base(channel, javaSocket) { }
public TcpServerSocketChannelUnsafe(TcpServerSocketChannel channel) : base(channel) { }
public override void FinishRead(SocketChannelAsyncOperation operation) { Contract.Assert(this.channel.EventLoop.InEventLoop); TcpServerSocketChannel ch = this.Channel; if ((ch.ResetState(StateFlags.ReadScheduled) & StateFlags.Active) == 0) { return; // read was signaled as a result of channel closure } IChannelConfiguration config = ch.Configuration; IChannelPipeline pipeline = ch.Pipeline; IRecvByteBufAllocatorHandle allocHandle = this.Channel.Unsafe.RecvBufAllocHandle; allocHandle.Reset(config); bool closed = false; Exception exception = null; try { Socket connectedSocket = null; try { connectedSocket = operation.AcceptSocket; operation.Validate(); operation.AcceptSocket = null; var message = new TcpSocketChannel(ch, connectedSocket, true); ch.ReadPending = false; pipeline.FireChannelRead(message); allocHandle.IncMessagesRead(1); if (!config.AutoRead && !ch.ReadPending) { // ChannelConfig.setAutoRead(false) was called in the meantime. // Completed Accept has to be processed though. return; } while (allocHandle.ContinueReading()) { connectedSocket = null; connectedSocket = ch.Socket.Accept(); message = new TcpSocketChannel(ch, connectedSocket, true); ch.ReadPending = false; pipeline.FireChannelRead(message); allocHandle.IncMessagesRead(1); } } catch (ObjectDisposedException) { closed = true; } catch (Exception ex) { var asSocketException = ex as SocketException; if (asSocketException == null || asSocketException.SocketErrorCode != SocketError.WouldBlock) { Logger.Warn("Failed to create a new channel from an accepted socket.", ex); if (connectedSocket != null) { try { connectedSocket.Dispose(); } catch (Exception ex2) { Logger.Warn("Failed to close a socket.", ex2); } } exception = ex; } } allocHandle.ReadComplete(); pipeline.FireChannelReadComplete(); if (exception != null) { // ServerChannel should not be closed even on SocketException because it can often continue // accepting incoming connections. (e.g. too many open files) pipeline.FireExceptionCaught(exception); } if (closed) { if (ch.Open) { this.CloseAsync(); } } } finally { // Check if there is a readPending which was not processed yet. if (!closed && (ch.ReadPending || config.AutoRead)) { ch.DoBeginRead(); } } }
public override void FinishRead(SocketChannelAsyncOperation operation) { Contract.Requires(this.channel.EventLoop.InEventLoop); TcpServerSocketChannel ch = this.Channel; ch.ResetState(StateFlags.ReadScheduled); IChannelConfiguration config = ch.Configuration; int maxMessagesPerRead = config.MaxMessagesPerRead; IChannelPipeline pipeline = ch.Pipeline; bool closed = false; Exception exception = null; int messageCount = 0; try { Socket connectedSocket = null; try { connectedSocket = operation.AcceptSocket; operation.Validate(); operation.AcceptSocket = null; var message = new TcpSocketChannel(ch, connectedSocket); ch.ReadPending = false; pipeline.FireChannelRead(message); messageCount++; if (!config.AutoRead && !ch.ReadPending) { // ChannelConfig.setAutoRead(false) was called in the meantime. // Completed Accept has to be processed though. return; } while (messageCount < maxMessagesPerRead) { connectedSocket = null; connectedSocket = ch.Socket.Accept(); message = new TcpSocketChannel(ch, connectedSocket); pipeline.FireChannelRead(message); // stop reading and remove op if (!config.AutoRead) { break; } messageCount++; } } catch (ObjectDisposedException) { closed = true; } catch (Exception ex) { var asSocketException = ex as SocketException; if (asSocketException == null || asSocketException.SocketErrorCode != SocketError.WouldBlock) { ChannelEventSource.Log.Warning("Failed to create a new channel from an accepted socket.", ex); if (connectedSocket != null) { try { connectedSocket.Close(); } catch (Exception ex2) { ChannelEventSource.Log.Warning("Failed to close a socket.", ex2); } } exception = ex; } } pipeline.FireChannelReadComplete(); if (exception != null) { // ServerChannel should not be closed even on SocketException because it can often continue // accepting incoming connections. (e.g. too many open files) pipeline.FireExceptionCaught(exception); } if (closed) { if (ch.Open) { this.CloseAsync(); } } } finally { // Check if there is a readPending which was not processed yet. if (!closed && (config.AutoRead || ch.ReadPending)) { ch.DoBeginRead(); } } }