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

全部博文(39)

文章存档

2012年(5)

2011年(16)

2010年(18)

分类: C/C++

2011-02-25 11:51:02

发送文件描述符函数
 
  1. /*
  2. * 从fd中接收消息,并将文件描述符放在指针recvfd中
  3. */
  4. ssize_t recv_fd(int fd, void*data, size_t bytes, int*recvfd)
  5. {
  6.    struct msghdr msghdr_recv; /*建立一个消息,之后填充此消息的成员数据,并发送给fd*/
  7.    struct iovec iov[1]; /*为向量,消息的数据在此项中保存*/
  8.    size_t n;
  9.    int newfd;
  10.    /*建立一个联合结构,便于进行消息的处理*/
  11.    union{
  12.        struct cmsghdr cm;
  13.        char control[CMSG_SPACE(sizeof(int))];
  14.    }control_un;
  15.    struct cmsghdr*pcmsghdr; /*消息头部*/
  16.    msghdr_recv.msg_control = control_un.control; /*控制消息*/
  17.    msghdr_recv.msg_controllen = sizeof(control_un.control); /*控制消息的长度*/
  18.      
  19.    msghdr_recv.msg_name = NULL; /*消息的名称为空*/
  20.    msghdr_recv.msg_namelen = 0; /*消息的长度为空*/
  21.      
  22.    iov[0].iov_base = data; /*向量的数据为传入的数据*/
  23.    iov[0].iov_len = bytes; /*向量的长度为传入数据的长度*/
  24.    msghdr_recv.msg_iov = iov; /*消息向量指针*/
  25.    msghdr_recv.msg_iovlen = 1; /*消息向量的个数为1个*/
  26.    if((n = recvmsg(fd, &msghdr_recv, 0))<=0) /*接收消息*/
  27.        return n;
  28.          
  29.    if((pcmsghdr = CMSG_FIRSTHDR(&msghdr_recv))!= NULL && /*获得消息的头部*/
  30.        pcmsghdr->cmsg_len == CMSG_LEN(sizeof(int))){ /*获得消息的长度为int*/
  31.        if(pcmsghdr->cmsg_level != SOL_SOCKET) /*消息的level应该为SOL_SOCKET*/
  32.            printf("control level != SOL_SOCKET\n");
  33.          
  34.        if(pcmsghdr->cmsg_type != SCM_RIGHTS) /*消息的类型判断*/
  35.            printf("control type != SCM_RIGHTS\n");
  36.              
  37.            *recvfd =*((int*)CMSG_DATA(pcmsghdr)); /*获得打开文件的描述符*/
  38.    }else
  39.        *recvfd = -1;
  40.          
  41.    return n; /*返回接收消息的长度*/
  42. }
阅读(2023) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~