コード例 #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);
        }
コード例 #2
0
        public unsafe EndPoint GetLocalAddress()
        {
            sockaddr_storage addr;
            socklen_t        length = SizeOf.sockaddr_storage;

            if (getsockname(_fd, (sockaddr *)&addr, &length) != 0)
            {
                throw new ErrnoException(errno);
            }
            return(IPEndPointFormatter.AddrToIpEndPoint(&addr));
        }
コード例 #3
0
        public unsafe LinuxSocket Accept(out IPEndPoint endPoint)
        {
            sockaddr_storage addr;
            socklen_t        len = SizeOf.sockaddr_storage;
            var rv = accept4(_fd, (sockaddr *)&addr, &len, SOCK_NONBLOCK | SOCK_CLOEXEC);

            if (rv < 0)
            {
                var err = errno;
                if (err == EAGAIN || err == EWOULDBLOCK || err == EINTR)
                {
                    endPoint = default;
                    return(-1);
                }

                throw new ErrnoException(err);
            }

            endPoint = IPEndPointFormatter.AddrToIpEndPoint(&addr);
            return(rv);
        }