suanmeilizhi 发表于 2012-10-18 23:32

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???

suanmeilizhi 发表于 2012-10-19 20:02

UP~~~~~~~~~

linux_c_py_php 发表于 2012-10-19 20:03

那么说明返回值只包括iov部分, 控制信息不算数, 因为sendmsg是发送iov进行通信的, 这个msg结构体只是给内核看的, 不可能发送失败, 很容易理解.

suanmeilizhi 发表于 2012-10-19 20:10

回复 3# linux_c_py_php


    但是这段代码的作用是发送fd_to_send,而fd_to_send是包含在控制信息struct cmsghdr中的,那岂不是最初的目标没有达到?

linux_c_py_php 发表于 2012-10-19 21:31

本帖最后由 linux_c_py_php 于 2012-10-19 21:33 编辑

汗, 怎么就那么费解呢...不行你就看APUE的例子确定一下这个问题, 不用瞎琢磨了, manpage里没有这方面的详细说明.

人家就是返回iov写出的大小, 控制信息是百分百能发到内核的, 不会返回给你实际发送的尺寸.

dragon1846 发表于 2012-10-24 10:55

mark,up,upup
页: [1]
查看完整版本: sendmsg函数返回值的问题