コード例 #1
0
        public unsafe static PosixResult CompleteZeroCopy(int socket)
        {
            msghdr msg           = default(msghdr);
            int    controlLength = 100;
            byte * control       = stackalloc byte[controlLength];

            do
            {
                msg.msg_control    = control;
                msg.msg_controllen = controlLength;

                ssize_t rv;
                do
                {
                    rv = recvmsg(socket, &msg, MSG_NOSIGNAL | MSG_ERRQUEUE);
                } while (rv < 0 && errno == EINTR);

                if (rv == -1)
                {
                    return(PosixResult.FromReturnValue(rv));
                }
                cmsghdr *cm = CMSG_FIRSTHDR(&msg);
                if (cm == null)
                {
                    continue;
                }

                if (!((cm->cmsg_level == SOL_IP && cm->cmsg_type == IP_RECVERR) ||
                      (cm->cmsg_level == SOL_IPV6 && cm->cmsg_type == IPV6_RECVERR)))
                {
                    continue;
                }

                sock_extended_err *serr = (sock_extended_err *)CMSG_DATA(cm);
                if ((serr->ee_origin != SO_EE_ORIGIN_ZEROCOPY) ||
                    (serr->ee_errno != 0))
                {
                    continue;
                }

                return(new PosixResult(((serr->ee_code & SO_EE_CODE_ZEROCOPY_COPIED) != 0) ?
                                       ZeroCopyCopied : ZeroCopySuccess));
            } while (true);
        }
コード例 #2
0
 public static sockaddr *SO_EE_OFFENDER(sock_extended_err *ee) => ((sockaddr *)((ee) + 1));