加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux网络编程之socket(十六)

发布时间:2016-09-26 09:17:32 所属栏目:Linux 来源:站长网
导读:通过UNIX域套接字传递描述符和 sendmsg/recvmsg 函数 在前面我们介绍了UNIX域套接字编程,更重要的一点是UNIX域套接字可以在同一台主机上各进程之间传递文件描
副标题[/!--empirenews.page--]

通过UNIX域套接字传递描述符和 sendmsg/recvmsg 函数

在前面我们介绍了UNIX域套接字编程,更重要的一点是UNIX域套接字可以在同一台主机上各进程之间传递文件描述符。

下面先来看两个函数:

#include <sys/types.h>

#include <sys/socket.h>

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

它们与sendto 和 recvfrom 函数相似,只不过可以传输 更复杂的数据结构,不仅可以传输一般数据,还可以传输额外的数据,即文件描述符。下面来看结构体msghdr :

struct msghdr {

              void         *msg_name;       /* optional address */

              socklen_t     msg_namelen;    /* size of address */

              struct iovec *msg_iov;        /* scatter/gather array */

              size_t        msg_iovlen;     /* # elements in msg_iov */

              void         *msg_control;    /* ancillary data, see below */

              size_t        msg_controllen; /* ancillary data buffer len */

              int           msg_flags;      /* flags on received message */

          };

如下图所示:

linux网络编程之socket(十六)

1、msg_name : 即对等方的地址指针,不关心时设为NULL即可;

2、msg_namelen:地址长度,不关心时设置为0即可;

3、 msg_iov:是结构体iovec 的指针。

struct iovec {

              void  *iov_base;    /* Starting address */

              size_t iov_len;     /* Number of bytes to transfer */

          };

成员iov_base 可以认为是传输正常数据时的buf,iov_len 是buf 的大小。

4、msg_iovlen:当有n个 iovec 结构体时,此值为n;

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读