这一章讲的是Unix域协议,首先讲了用这个的三个理由:一是比同一主机用TCP套接字快,二是用来在不同进程之间传递文件描述符,三是提供客户凭证给服务器。
首先是一个bind调用的例子。把一个sockaddr_un绑定到套接字上。
接着讲了socketpair函数,连接两个Unix域套接字用的,套接字是匿名的,没有隐式的bind调用。
接下去是用Unix域修改了之前的回射的例子。分别用了字节流和数据报两种方式。其中有个地方需要注意一下,就是用数据报协议时,与UDP不同,客户端程序必须为套接字bind路径名。
接下来又是一个好戏,讲描述符的传递。首先讲了父子进程和无亲缘关系的进程如何创建Unix域套接字用于通信,通过msghdr结构用sendmsg发送出去,注意这会让描述符的引用计数加1,接收进程调用recvmsg接收,这时候也要注意,这不是描述符的直接传递,而是在接受进程新建一个描述符,指向内核中相同的文件表项。
接着讲了个经典的例子,在很多现在的网络程序都能看到这个例子的影子。以下一些注意的地方:
CMSG_SPACE这个宏是用于使自己定义的cmsg对齐的。因为msg_control缓冲区必须为cmsghdr结构适当地对齐。这里用了一个技巧,使用union进行对齐。
最后是接受发送者凭证,用到在看吧,这里先略了。。。
阅读(1672) | 评论(0) | 转发(0) |