name
unix,AF_UNIX,AF_LOCAL - 本地进程间通信套接字
SYSNOPSIS:
#include
#include
unix_socket = socket(AF_UNIX, type, 0);
error = socketpair(AF_UNIX, type, 0, int *sv);
DESCRIPTION:
AF_UNIX(也被称作AF_LOCAL)套接字用于在同一台机器上的不同进程间的有效通信。传统的来讲,unix套接字可以是无名的,或者被绑定在一个系统文件上(被标记为套接字类型的系统文件)。linux也支持一个独立于文件系统的抽象名字空间。
有效的类型有:SOCK_STREAM,一个面向流的套接字和SOCK_DGRAM,一个面向数据报文的套接字,用来保护消息边界(至于大多数unix的变形,unix域数据报文套接字是可靠的而且并不记录数据报文),对于有链接的套接字,SOCK_SEQPACKET保护用户消息边界,并且按照消息发送的顺序传递消息。
unix套接字支持通过附加数据传递文件描述符或者进程标识符给其他进程。
ADDRESS Format
一个unix域套接字如下属结构:
#define UNIX_PATH_MAX 108
struct sockaddr_un{
sa_family_t sun_family; //AF_UNIX
char sun_path[unix_path_max]; //path name
};
sun_family也就是AF_UNIX.
一下三种类型的地址在结构里面是有区别的:
pathname:一个unix域套接字可以通过bind函数和一个以'\0'结尾的文件系统路径名。如果套接字的地址通过getsockname(2),getpeername(2),accept(2)返回,它的长度是sizeof(sa_family_t)±strlen(sun_path)±1,并且sun_path包含'\0'结尾的路径名。
unnamed:没有通过bind函数绑定一个路径名的流套接字是没有名字的。同样的,通过socketpair(2)创建的两个套接字也是没有名字的。无名socket的地址如果是被getsocketname(2),getpeername(2),accept(2),它的长度是sizeof(sa_family_t),而且sun_path应该被检查。
abstract:抽象socket地址的特征是sun_path[0]是'\0',sun_path其余的字节定义了socket的‘名字’,‘名字’中的空字节没有什么特别的意义。这个名字和文件系统路径名没有没有联系。这个名字空间中socket的地址通过sun_path的剩余字节给出。如果抽象套接字的地址是通过getsocketname(2),getpeername(2),accept(2)给出,它的长度就是sizeof(struct sockaddr_un),sun_path包含抽象名。抽象套接字名字空间是non-portable linux extension.
socket 选项:
由于历史的原因,这些套接字选项由SOL_SOCKET指定,尽管他们有AF_UNIX特性。可以通过指定SOL_SOCKET作为他们的socket family来设置setsockopt(2),或者读取getsockopt(2)socket 选项。
SO_PASSCRED
允许接收进程辅助信息发送的信用证明. 当设置了该选项且套接字 尚未连接时, 则会自动生成一个抽象名字空间的唯一名字. 值为一个整数布尔标 识.
阅读(10653) | 评论(0) | 转发(0) |