Exemple #1
0
        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);
        }
Exemple #2
0
        private void PollAccept(AcceptSocketContext acceptSocket)
        {
            var socket = acceptSocket.Socket;

            Debug.WriteLine($"Adding accept on {(int)socket}");
            _ring.PreparePollAdd(socket, (ushort)POLLIN, Mask(socket, AcceptPollMask));
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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();
        }
Exemple #5
0
        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));
        }