cmsg=CMSG_FIRSTHDR(&mhdr);//我们利用CMSG_FIRSTHDR找到控制信息在mhdr结构体中的真正地址//利用CMSG_LEN算出控制信息cmsghdr结构中真正的控制数据的长度cmsg->cmsg_len=CMSG_LEN(sizeof(*pk));cmsg->cmsg_level=IPPROTO_IPV6;//填写cmsghdr控制信息结构体cmsg->cmsg_type=IPV6_PKTINFO;//CMSG_DATA(cmsg)...
CMSG_DATA(cmsg) 如果自变量是指向 cmsghdr 结构的指针,那么此宏将返回指向与 cmsghdr 结构关联的数据数组的无符号字符指针。 CMSG_NXTHDR(mhdr 和 cmsg) 如果第一个自变量是指向 msghdr 结构的指针,而第二个自变量是指向辅助数据中的 cmsghdr 结构的指针 (由该 msghdr 结构的 msg_control 字段指向) ,那么...
(cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) { int *fds = (int *) CMSG_DATA(cmsg); int num_fds = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int); // 处理文件描述符 for...
cmsg->cmsg_level = IPPROTO_IPV6;//填写cmsghdr控制信息结构体 cmsg->cmsg_type = IPV6_PKTINFO; //CMSG_DATA(cmsg) 能够找到真正的控制信息在cmsghdr结构体中的位置,之后我们就能够利用memcpy把控制结构体的数据复制到cmsg中: memcpy(CMSG_DATA(cmsg), pk, sizeof(*pk)); 以上是发送的过程。接收过程跟...
CMSG_SPACE:用于设置下一个辅助数据总的大小(参数指定) CMSG_LEN:参数为cmsghdr的cmsg_data成员的大小,然后将此大小+cmsghdr其他成员的大小作为cmsghdr结构体的总大小作为返回值返回,通常将返回值作为cmsg_len的值 CMSG_DATA:指向与cmsghdr结构关联的数据的第一个字节的指针 ...
5、msg_control:是一个指向cmsghdr 结构体的指针 1. struct cmsghdr { 2. /* data byte count, including header */ 3. int cmsg_level; /* originating protocol */ 4. int cmsg_type; /* protocol-specific type */ 5. /* followed by unsigned char cmsg_data[]; */ ...
传入send_fd 的大小,CMSG_LEN宏可以得到cmsg_len 字段的大小。 最后,传入结构体指针 p_cmsg ,宏CMSG_DATA 可以得到准备存放send_fd 的位置指针,将send_fd 放进去,如下: p_fds = (int*)CMSG_DATA(p_cmsg); *p_fds = send_fd; // 通过传递辅助数据的方式传递文件描述符 ...
// 定义tcp_recvmsg函数,负责接收TCP消息 int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags, int *addr_len) { int cmsg_flags = 0, ret; // 初始化控制消息标志和返回值 struct scm_timestamping_internal tss; // 时间戳结构体 // 检查是否有错误消息需要处理 【这块...
if (udp_test_bit(GRO_ENABLED, sk)) udp_cmsg_recv(msg, sk, skb); // 处理IP层辅助数据。 if (inet_cmsg_flags(inet)) ip_cmsg_recv_offset(msg, sk, skb, sizeof(struct udphdr), off); // 设置返回的错误码。 err = copied; if (flags & MSG_TRUNC) err = ulen; // 消费或回收...
int cmsg_type; /* protocol-specific type */ /* followed by unsigned char cmsg_data[]; */ }; Thecmsg_lenfield is the total length including this header.cmsg_levelis the originating protocol.cmsg_typeis the protocol-specific type. If ancillary data and descriptors are not being passed, the...