在使用sendmsg进行进程间通信时,可以通过携带共享内存来实现数据的交互。具体步骤如下: 创建共享内存段:使用shm_open或者其他方式创建共享内存段。 设置共享内存的大小和权限等属性,并将其映射到进程的虚拟地址空间中。 将共享内存相关信息填入msghdr结构体的控制消息部分(msg_control)。 调用sendmsg发送消息,其中控制消息...
数据包是在iov.iov_base中设置的,当使用recvmsg读取数据时,数据包直接从msg->msg_control读取。
msg_iov,msg_iovlen : 指定输入或输出的缓冲区数组。 msg_control,msg_controllen : 可选的辅助数据的位置和大小。 注意事项: 在sendmsg中,会忽略msg_flags成员,他会按照参数flags直接处理。那么当我们去设置MSG_DONTWAIT(临时非阻塞)是就把flags设为MSG_DONTWAIT而把msg_flags设为不起作用。 在recvmsg中,使用ms...
用于发送数据:sendmsg函数可以用来向另一个Unix域套接字发送数据。通过sendmsg函数可以发送多个数据块,每个数据块可以包含不同的数据和控制信息。 用于传递文件描述符:sendmsg函数可以用来传递文件描述符。通过设置msg_control字段和使用cmsghdr结构体,可以将文件描述符在不同进程之间传递。 用于发送控制信息:sendmsg函数可以...
void *msg_control:可选的,指向辅助数据的缓冲区。 size_t msg_controllen:msg_control的长度。 int msg_flags:控制消息发送的标志位,与sendmsg的flags参数不同,这个是在msghdr结构体内部定义的。 flags:控制sendmsg行为的标志位,如MSG_DONTWAIT表示非阻塞发送。sendmsg函数的使用场景 sendmsg函数的使用场景包括但不限...
int msg_iovlen ; / * 缓冲区的个数 * / void * msg_control ; / * 辅助数据的地址 * / socklen_t msg_controllen ; / * 辅助数据的长度 * / int msg_flags ; / * 接收消息的标识 * / } ; 其中的前两个成员主要用于保存当前使用的协议的地址,比如使用了tcp协议、udp协议、UNIX domain协议等...
1.msg.msg_name:指向消息名字符串的指针。消息名是一个字符串,用于表示消息的类型,例如“Hello, World!”等。 2.msg.msg_namelen:表示消息名字符串的长度。这个参数是一个整数,通常在编译时计算。 3.msg.msg_control:指向控制数据的指针。控制数据用于表示消息的特定含义,例如消息的优先级、标识符等。 4.msg...
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...
msg_namelen 对于 sendmsg 是一个值参数,对于 recvmsg 却是一个值-结果参数。 msg_iov 和 msg_iovlen 这两个成员指定输入或输出缓冲区数组(即iovec结构数组),类似 readv 或 writev 的第二个和第三个参数。 msg_control 和 msg_controllen 这两个成员指定可选的辅助数据的位置和大小。msg_controllen 对于 re...
message.msg_name = &client_addr; message.msg_namelen = addrlen; message.msg_iov = iov; message.msg_iovlen = 1; message.msg_control = ctrl; message.msg_controllen = sizeof(ctrl); struct cmsghdr *p; p = CMSG_FIRSTHDR(&message); p->cmsg_len = sizeof(ctrl); p->cm...