sendmsg函数返回值的问题
如题,sendmsg函数返回的是发送的有效字节数还是所有的字节数,包括控制信息?#include <stdio.h>#include <stdlib.h>
#include <sys/socket.h>
#define CONTROLLENCMSG_LEN(sizeof(int))
static struct cmsghdr *cmptr = NULL;
int
send_fd(int fd, int fd_to_send)
{
struct iovec iov;
struct msghdr msg;
char buf;
iov.iov_base = buf;
iov.iov_len = 2;
msg.msg_iov = iov;
msg.msg_iovlen = 1;
msg.msg_name = NULL;
msg.msg_namelen = 0;
if(fd_to_send < 0) {
msg.msg_control = NULL;
msg.msg_controllen = 0;
buf = -fd_to_send;
if(buf == 0)
buf = 1;
} else {
if(cmptr = NULL && (cmptr = maoolc(CONTROLLEN)) == NULL)
return -1;
cmptr->cmsg_level = SOL_SOCKET;
cmptr->cmsg_type = SCM_RIGHTS;
cmptr->cmsg_len = CONTROLLEN;
msg.msg_control = cmptr;
msg.msg_controllen = CONTROLLEN;
*(int *)CMSG_DATA(cmptr) = fd_to_send;
buf = 0;
}
buf = 0;
if(sendmsg(fd, &msg, 0) != 2)
return -1;
return 0;
}
如上面的代码,明明传递了一个buf,还有整型fd_to_send,为什么返回字节为2??? UP~~~~~~~~~ 那么说明返回值只包括iov部分, 控制信息不算数, 因为sendmsg是发送iov进行通信的, 这个msg结构体只是给内核看的, 不可能发送失败, 很容易理解. 回复 3# linux_c_py_php
但是这段代码的作用是发送fd_to_send,而fd_to_send是包含在控制信息struct cmsghdr中的,那岂不是最初的目标没有达到? 本帖最后由 linux_c_py_php 于 2012-10-19 21:33 编辑
汗, 怎么就那么费解呢...不行你就看APUE的例子确定一下这个问题, 不用瞎琢磨了, manpage里没有这方面的详细说明.
人家就是返回iov写出的大小, 控制信息是百分百能发到内核的, 不会返回给你实际发送的尺寸.
mark,up,upup
页:
[1]