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);
public static unsafe PosixResult SetSockOpt(Socket socket, SocketOptionLevel optionLevel, SocketOptionName optionName, byte *optionValue, int optionLen) => SetSockOpt(socket.DangerousGetHandle().ToInt32(), optionLevel, optionName, optionValue, optionLen);
public static PosixResult Listen(Socket socket, int backlog) => Listen(socket.DangerousGetHandle().ToInt32(), backlog);
public static unsafe PosixResult Bind(Socket socket, byte *addr, int addrlen) => Bind(socket.DangerousGetHandle().ToInt32(), addr, addrlen);
public static unsafe PosixResult GetPeerName(Socket socket, byte *addr, int addrlen) => GetPeerName(socket.DangerousGetHandle().ToInt32(), addr, addrlen);