免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5158 | 回复: 5
打印 上一主题 下一主题

[Linux] sendmsg函数返回值的问题 [复制链接]

论坛徽章:
1
亥猪
日期:2013-10-30 23:29:55
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-18 23:32 |只看该作者 |倒序浏览
如题,sendmsg函数返回的是发送的有效字节数还是所有的字节数,包括控制信息?
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/socket.h>

  4. #define CONTROLLEN  CMSG_LEN(sizeof(int))

  5. static struct cmsghdr *cmptr = NULL;

  6. int
  7. send_fd(int fd, int fd_to_send)
  8. {
  9.     struct iovec iov[1];
  10.     struct msghdr msg;
  11.     char buf[2];

  12.     iov[0].iov_base = buf;
  13.     iov[0].iov_len = 2;
  14.     msg.msg_iov = iov;
  15.     msg.msg_iovlen = 1;
  16.     msg.msg_name = NULL;
  17.     msg.msg_namelen = 0;
  18.     if(fd_to_send < 0) {
  19.         msg.msg_control = NULL;
  20.         msg.msg_controllen = 0;
  21.         buf[1] = -fd_to_send;
  22.         if(buf[1] == 0)
  23.             buf[1] = 1;
  24.     } else {
  25.         if(cmptr = NULL && (cmptr = maoolc(CONTROLLEN)) == NULL)
  26.             return -1;
  27.         cmptr->cmsg_level = SOL_SOCKET;
  28.         cmptr->cmsg_type = SCM_RIGHTS;
  29.         cmptr->cmsg_len = CONTROLLEN;
  30.         msg.msg_control = cmptr;
  31.         msg.msg_controllen = CONTROLLEN;
  32.         *(int *)CMSG_DATA(cmptr) = fd_to_send;
  33.         buf[1] = 0;
  34.     }
  35.     buf[0] = 0;
  36.     if(sendmsg(fd, &msg, 0) != 2)
  37.         return -1;
  38.     return 0;
  39. }
复制代码
如上面的代码,明明传递了一个buf,还有整型fd_to_send,为什么返回字节为2???

论坛徽章:
1
亥猪
日期:2013-10-30 23:29:55
2 [报告]
发表于 2012-10-19 20:02 |只看该作者
UP~~~~~~~~~

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2012-10-19 20:03 |只看该作者
那么说明返回值只包括iov部分, 控制信息不算数, 因为sendmsg是发送iov进行通信的, 这个msg结构体只是给内核看的, 不可能发送失败, 很容易理解.

论坛徽章:
1
亥猪
日期:2013-10-30 23:29:55
4 [报告]
发表于 2012-10-19 20:10 |只看该作者
回复 3# linux_c_py_php


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

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
5 [报告]
发表于 2012-10-19 21:31 |只看该作者
本帖最后由 linux_c_py_php 于 2012-10-19 21:33 编辑

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

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

论坛徽章:
0
6 [报告]
发表于 2012-10-24 10:55 |只看该作者
mark,up,upup
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP