Beispiel #1
0
        public unsafe IList <ArraySegment <byte> > ReceiveMultipleMessages(IList <ArraySegment <byte> > buffers)
        {
            if (handle == -1)
            {
                throw new ObjectDisposedException(objectname);
            }
            GCHandle[] bufhandles = new GCHandle[buffers.Count];
            iovec *    iovecs     = stackalloc iovec[buffers.Count];
            mmsghdr *  hdrs       = stackalloc mmsghdr[buffers.Count];

            for (int i = 0; i < buffers.Count; i++)
            {
                bufhandles[i] = GCHandle.Alloc(buffers[i].Array, GCHandleType.Pinned);
                iovecs[i]     = new iovec()
                {
                    iov_base = (byte *)bufhandles[i].AddrOfPinnedObject() + buffers[i].Offset, iov_len = (UIntPtr)(UInt32)buffers[i].Count
                };
                hdrs[i] = new mmsghdr()
                {
                    msg_hdr = new msghdr()
                    {
                        msg_iov = &iovecs[i], msg_iovlen = (UIntPtr)1
                    }
                };
            }
            int ret = recvmmsg(handle, hdrs, (uint)buffers.Count, MSG_WAITFORONE, null);

            for (int i = 0; i < buffers.Count; i++)
            {
                bufhandles[i].Free();
            }
            if (ret == -1)
            {
                throw new PosixException("recvmmsg");
            }
            ArraySegment <byte>[] retvec = new ArraySegment <byte> [ret];
            for (int i = 0; i < ret && i < buffers.Count; i++)
            {
                retvec[i] = new ArraySegment <byte>(buffers[i].Array, buffers[i].Offset, (int)hdrs[i].msg_len);
            }
            return(retvec);
        }
Beispiel #2
0
 private static unsafe extern int recvmmsg(int sockfd, mmsghdr *msgvec, UInt32 vlen, int flags, timespec *timeout);