sendmsg()函数的函数原型如下:
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
msghdr 结构是这样的:
struct msghdr {
void *msg_name; /* optional address */
socklen_t msg_namelen; /* size of address */
struct iovec *msg_iov; /* scatter/gather array */
size_t msg_iovlen; /* # elements in msg_iov */
void *msg_control; /* ancillary data, see below */
size_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
};
如果我通过 UNIX 域套接字发送一条消息,sendmsg()
其中包含辅助数据msg_control
(例如带有 SCM_RIGHTS 的文件描述符)和常规消息数据msg_iov
,我是否能够msg_iov
从该消息的另一端读取常规数据套接字调用recv()
,或者我只能通过调用获取该数据recvmsg()
?换句话说,一个套接字实际上是否有两个不同的通道,一个用于sendmsg()
/ recvmsg()
,另一个用于send()
/ recv()
,或者两个常规消息数据流是否混合在一起?
如果不是,进程是否有可能通过向前读取常规消息数据的多个标头而不接收其辅助数据,然后仅在之后调用recvmsg()
以获取多个先前消息的辅助数据来违反消息与其辅助数据之间的关联,出了故障?
如果发送带有辅助数据的消息 A sendmsg()
,然后发送不带辅助数据的消息 B send()
,是否会阻止我在收到recv()
消息 A 之前接收消息 B recvmsg()
?
如果我从根本上误解了 UNIX 域套接字的任何底层机制,我深表歉意。如果有的话,如果有人能指出我所做的错误假设,我将不胜感激。