private void CompleteAccept(AcceptSocketContext acceptContext, int result) { if (result < 0) { var err = -result; if (err == EAGAIN || err == EINTR || err == EMFILE) { Debug.WriteLine($"accept completed with EAGAIN on {(int)acceptContext.Socket}"); Accept(acceptContext); return; } throw new ErrnoException(err); } LinuxSocket socket = result; Debug.WriteLine($"Accepted {(int)socket} from {(int)acceptContext.Socket}"); if (_threadContext.Options.TcpNoDelay) { socket.SetOption(SOL_TCP, TCP_NODELAY, 1); } var remoteEndpoint = IPEndPointFormatter.AddrToIpEndPoint(acceptContext.Addr); var context = new InboundConnectionContext(socket, acceptContext.EndPoint, remoteEndpoint, _threadContext); _connections[socket] = context; acceptContext.AcceptQueue.TryWrite(context); Accept(acceptContext); Read(context); ReadFromApp(context); }
private void PollAccept(AcceptSocketContext acceptSocket) { var socket = acceptSocket.Socket; Debug.WriteLine($"Adding accept on {(int)socket}"); _ring.PreparePollAdd(socket, (ushort)POLLIN, Mask(socket, AcceptPollMask)); }
private void Accept(AcceptSocketContext context) { var socket = context.Socket; Debug.WriteLine($"Adding accept on {(int)socket}"); _ring.AcquireSubmission(out var submission); submission.PrepareAccept(socket, (sockaddr *)context.Addr, context.AddrLen, SOCK_NONBLOCK | SOCK_CLOEXEC, Mask(socket, AcceptMask)); _ring.Release(submission); }
public void Bind(IPEndPoint endpoint, ChannelWriter <ConnectionContext> acceptQueue) { var domain = endpoint.AddressFamily == AddressFamily.InterNetwork ? AF_INET : AF_INET6; LinuxSocket s = socket(domain, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, IPPROTO_TCP); s.SetOption(SOL_SOCKET, SO_REUSEADDR, 1); s.SetOption(SOL_SOCKET, SO_REUSEPORT, 1); s.Bind(endpoint); s.Listen(ListenBacklog); var context = new AcceptSocketContext(s, endpoint, acceptQueue); _acceptSocketQueue.Enqueue(context); _threadContext.Notify(); }
private void CompleteAcceptPoll(AcceptSocketContext context) { LinuxSocket socket; while ((socket = context.Socket.Accept(out var clientEndpoint)) != -1) { if (_threadContext.Options.TcpNoDelay) { socket.SetOption(SOL_TCP, TCP_NODELAY, 1); } Debug.WriteLine($"Accepted {(int)socket}"); var connectionContext = new InboundConnectionContext(socket, context.EndPoint, clientEndpoint, _threadContext); _connections[socket] = connectionContext; context.AcceptQueue.TryWrite(connectionContext); PollRead(connectionContext); ReadFromApp(connectionContext); } PollAccept(context); }
private void Accept(AcceptSocketContext context) { var socket = context.Socket; _ring.PrepareAccept(socket, (sockaddr *)context.Addr, context.AddrLen, SOCK_NONBLOCK | SOCK_CLOEXEC, Mask(socket, AcceptMask)); }