public static PosixResult ReceiveSocket(Socket fromSocket, out Socket socket, bool blocking)
        {
            int         receiveSocketFd;
            PosixResult result = ReceiveSocket(fromSocket.DangerousGetHandle().ToInt32(), out receiveSocketFd, blocking);

            socket = result.IsSuccess ? new Socket(receiveSocketFd) : null;
            return(result);
        }
        public static unsafe PosixResult Accept(Socket socket, bool blocking, out Socket clientSocket)
        {
            int         clientSocketFd;
            PosixResult result = Accept(socket.DangerousGetHandle().ToInt32(), blocking, out clientSocketFd);

            clientSocket = result.IsSuccess ? new Socket(clientSocketFd) : null;
            return(result);
        }
        public unsafe static PosixResult AcceptAndSendHandleTo(Socket fromSocket, int toSocket)
        {
            int     acceptFd = fromSocket.DangerousGetHandle().ToInt32();
            ssize_t rv;

            do
            {
                rv = accept4(acceptFd, null, null, SOCK_CLOEXEC);
            } while (rv < 0 && errno == EINTR);

            if (rv != -1)
            {
                int acceptedFd = (int)rv;

                byte  dummyBuffer = 0;
                iovec iov         = default(iovec);
                iov.iov_base = &dummyBuffer;
                iov.iov_len  = 1;

                int   controlLength = CMSG_SPACE(sizeof(int));
                byte *control       = stackalloc byte[controlLength];

                msghdr header = default(msghdr);
                header.msg_iov        = &iov;
                header.msg_iovlen     = 1;
                header.msg_control    = control;
                header.msg_controllen = controlLength;

                cmsghdr *cmsg = CMSG_FIRSTHDR(&header);
                cmsg->cmsg_level = SOL_SOCKET;
                cmsg->cmsg_type  = SCM_RIGHTS;
                cmsg->cmsg_len   = CMSG_LEN(sizeof(int));
                int *fdptr = (int *)CMSG_DATA(cmsg);
                *    fdptr = acceptedFd;

                do
                {
                    rv = sendmsg(toSocket, &header, MSG_NOSIGNAL);
                } while (rv < 0 && errno == EINTR);

                IOInterop.Close(acceptedFd);
            }

            return(PosixResult.FromReturnValue(rv));
        }
 public static PosixResult Shutdown(Socket socket, int how)
 => Shutdown(socket.DangerousGetHandle().ToInt32(), how);
 public static PosixResult GetAvailableBytes(Socket socket)
 => GetAvailableBytes(socket.DangerousGetHandle().ToInt32());
 public static unsafe PosixResult TryGetPeerIPAddress(Socket socket, out IPEndPointStruct ep, IPAddress reuseAddress = null)
 => TryGetPeerIPAddress(socket.DangerousGetHandle().ToInt32(), out ep, reuseAddress);
 public static unsafe PosixResult GetSockName(Socket socket, sockaddr_storage *addr)
 => GetSockName(socket.DangerousGetHandle().ToInt32(), addr);
 public static unsafe PosixResult SetSockOpt(Socket socket, int level, int optname, void *optval, socklen_t optlen)
 => SetSockOpt(socket.DangerousGetHandle().ToInt32(), level, optname, optval, optlen);
Example #9
0
 public static unsafe PosixResult SetSockOpt(Socket socket, SocketOptionLevel optionLevel, SocketOptionName optionName, byte *optionValue, int optionLen)
 => SetSockOpt(socket.DangerousGetHandle().ToInt32(), optionLevel, optionName, optionValue, optionLen);
Example #10
0
 public static PosixResult Listen(Socket socket, int backlog)
 => Listen(socket.DangerousGetHandle().ToInt32(), backlog);
Example #11
0
 public static unsafe PosixResult Bind(Socket socket, byte *addr, int addrlen)
 => Bind(socket.DangerousGetHandle().ToInt32(), addr, addrlen);
Example #12
0
 public static unsafe PosixResult GetPeerName(Socket socket, byte *addr, int addrlen)
 => GetPeerName(socket.DangerousGetHandle().ToInt32(), addr, addrlen);