UNIX网络编程读书笔记:UNIX域协议


sun_path[];

存放在sun_path数组中的路径名必须以空格字符结尾。

实现提供的SUN_LEN宏以一个指向sockaddr_un结构的指针为参数并返回该结构的长度,其中包括路径名中非空字节数。

未指定地址(通配地址),通过以空字符串作为路径名指示,也就是一个sun_path[0]值为0的地址结构。这是UNIX域中与IPv4的INADDR_ANY常值以及IPv6的IN6ADDR_ANY_INIT常值等价的一个地址。

POSIX把UNIX域协议重新命名为“本地IPC”,以消除它对于UNIX操作系统的依赖。历史性的AF_UNIX常值变为AF_LOCAL。尽管POSIX努力使它独立于操作系统,它的套接口地址结构仍然保留_un后缀。

热烈的笑脸实例:UNIX域套接口的bind调用

创建一个UNIX域套接口,往其上bind一个路径名,再调用getsockname输出这个绑定的路径名。

#include <sys/un.h><sys/socket.h><stdio.h><stdlib.h><unistd.h><sys/types.h>
 argc,  **(argc != = socket(AF_LOCAL, SOCK_STREAM, ]);    &addr1, =], (addr1.sun_path) -  sockaddr *)&addr1, SUN_LEN(&=  sockaddr *)&addr2, &

运行结果如下:

socketpair( family, type, protocol, sockfd[——成功,-——出错

family参数必须为AF_LOCAL;

protocol参数必须为0;

type参数可以是SOCK_STREAM,也可以是SOCK_DGRAM。

新创建的两个套接口描述字作为sockfd[0]和sockfd[1]返回。

本函数类似于UNIX的pipe函数:返回两个彼此连接的描述字。事实上,源自berkeley的实现通过执行与socketpair一样的内部操作给出pipe接口。

这样创建的两个套接口不曾命名;也就是说其中没有涉及隐式的bind调用。它与调用pipe创建的普通UNIX管道类似,差别在于流管道是全双工的,即两个描述字都是既可读又可写。

POSIX不要求全双工管道。

红心套接口函数

当用于UNIX域套接口时,套接口函数中存在一些差异和限制:

灯泡由bind创建的路径名缺省访问权限应为0777(属主用户、组用户和其他用户都可读、可写并可执行),并按照当前umask值进行修正。

灯泡与UNIX域套接口关联的路径名应该是一个绝对路径名,而不是一个相对路径名。

灯泡在connect调用中指定的路径名必须是一个当前捆绑在某个打开的UNIX域套接口上的路径名,而且它们的套接口类型(字节流或数据报)也必须一致。

灯泡调用connect连接一个UNIX域套接口涉及的权限测试等同于调用open以只读方式访问相应的路径名。

灯泡UNIX域字节流套接口类似于TCP套接口:它们都为进程提供一个无记录边界的字节流接口。

灯泡如果对于某个UNIX域字节流套接口的connect调用发现这个监听套接口的队列已满,调用就立即返回一个ECONNREFUSED错误。这一点不同于TCP:如果TCP监听套接口的队列已满,TCP监听端就忽略新到达的SYN,而TCP连接发起端将数次发送SYN进行重试。

灯泡UNIX域数据报套接口类似UDP套接口:它们都提供一个保留记录边界的不可靠的数据报服务。

灯泡在一个未绑定的UNID域套接口上发送数据报不会自动给这个套接口捆绑一个路径名,这一点不同于UDP套接口:在一个未绑定的UDP套接口上发送UDP数据报导致给这个套接口捆绑一个临时端口。这一点意味着除非数据报发送端已经捆绑一个路径名到它的套接口,否则数据报接收端无法发回应答数据报。类似地,对于某个UNIX域数据报套接口的connect调用不会给本套接口绑定一个路径名,这一点不同于TCP和UDP。

未完待续。。。

相关内容