Linux网络编程之socket编程(十六)

上一篇初步学习了UNIX域协议相关知识,接下来继续学习socketpair函数、sendmsg/recvmsg函数以及UNIX域套接字传递描述符字。

1.socketpair函数
  • 功能:创建一个全双工的流管道
  • 原型:int socketpair(int domain, int type, int protocol, int sv[2]);
  • 参数:
    • domain:协议家族
    • type:套接字类型
    • protocol:协议类型
    • sv:返回套接字对
  • 返回值:成功返回0;失败返回-1

(1)socketpair函数有点类似于linux系统编程里讲的半双工pipe管道。socketpair与之不同的是:它是一个全双工的流管道;其他一样,它也只能用于父子进程或者具有亲缘关系间的进程间进行通信。

(2)使用socketpair来实现一个全双工的通信

1)首先,创建一个套接字对,定义一个数组用来接收套接字对:
int sockfds[2];
socketpair(AF_UNIX, SOCK_STREAM, 0, sockfds);

2)这样的套接字对只能用于父子进程或亲缘关系进程间通信,fork()一个进程出来,在父子进程之间实现全双工的通信,pid>0为父进程,pid==0为子进程:
pid_t pid;
pid = fork();

3)定义一个变量,在父子进程间以++操作的方式来进行通信:

以上完整源码:

运行结果:

2.sendmsg/recvmsg
  • ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
  • ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

(1)sendmsg函数

sendmsg函数的功能比send函数的功能更加强大,发送到数据由结构体msghdr决定:

msghdr示意图如下所示:

msghdr

1)其中,msg_name和msg_namelen是地址信息,决定了地址和地址长度,如果不关心的话可以填空指针和0。
2)参数struct iovec *msg_iov是套接字要发送的数据。结构体中包括了缓冲区起始地址iov_base和缓冲区大小iov_len:

并且,指针msg_iov可以指向不止一个缓冲区,可以是多个缓冲区buf1,buf2。这样一来,通过sendmsg就可以发送两块数据给对方。相应地,参数msg_iovlen就变为2
3)如果要想通过sendmsg传递文件描述字的话,还需要一些辅助信息——即控制信息,它由msg_control来指定(但是,如果我们仅仅是来传递一些普通数据,那么这些控制信息可以不必关心)。
4)指针msg_control也指向一个结构体,该结构体中有4个成员。辅助数据示意图如下所示:辅助数据示意图

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注