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); }
private static unsafe extern int recvmmsg(int sockfd, mmsghdr *msgvec, UInt32 vlen, int flags, timespec *timeout);