Chinaunix首页 | 论坛 | 博客
  • 博客访问: 388297
  • 博文数量: 39
  • 博客积分: 1982
  • 博客等级: 上尉
  • 技术积分: 468
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-07 13:47
文章分类

全部博文(39)

文章存档

2012年(5)

2011年(16)

2010年(18)

分类: C/C++

2011-02-25 11:33:28

发送文件描述符函数
 
  1. ssize_t send_fd(int fd, void*data, size_t bytes, int sendfd)
  2. {
  3.     struct msghdr msghdr_send; /*发送消息,建立一个消息,之后填充此消息的成员数据,并发送给fd*/
  4.     struct iovec iov[1]; /*为向量,消息的数据在此项两种保存*/
  5.     size_t n; /*大小*/
  6.     int newfd; /*文件描述符*/
  7.     /*方便操作msg的结构 建立一个联合结构,便于进行消息的处理*/
  8.     union{
  9.         struct cmsghdr cm; /*control msg结构*/
  10.         char control[CMSG_SPACE(sizeof(int))]; /*字符指针,方便控制*/
  11.     }control_un;
  12.     struct cmsghdr*pcmsghdr=NULL; /*控制头部的指针*/
  13.     msghdr_send.msg_control = control_un.control; /*填充消息的控制部分*/
  14.     msghdr_send.msg_controllen = sizeof(control_un.control); /*控制部分的长度*/
  15.       
  16.     pcmsghdr = CMSG_FIRSTHDR(&msghdr_send); /*取得第一个消息头*/
  17.     pcmsghdr->cmsg_len = CMSG_LEN(sizeof(int)); /*获得长度 由于发送的是一个文件描述符,所以长度为一个int类型的长度*/
  18.     pcmsghdr->cmsg_level = SOL_SOCKET; /*用于控制消息*/
  19.     pcmsghdr->cmsg_type = SCM_RIGHTS;
  20.     *((int*)CMSG_DATA(pcmsghdr))= sendfd; /*socket值*/
  21.       
  22.       
  23.     msghdr_send.msg_name = NULL; /*名称*/
  24.     msghdr_send.msg_namelen = 0; /*名称长度*/
  25.       
  26.     iov[0].iov_base = data; /*向量指针*/
  27.     iov[0].iov_len = bytes; /*数据长度*/
  28.     msghdr_send.msg_iov = iov; /*填充消息*/
  29.     msghdr_send.msg_iovlen = 1;
  30.       
  31.     return (sendmsg(fd, &msghdr_send, 0)); /*发送消息*/
  32. }
阅读(2052) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~