图1 Unix域套接字通信模型
1.Unix域通信模型
Unix域套接字通信模型如图1所示
2.api接口
1)socket()
- int socket (int domain, int type, int protocol);
API定义是一样的,不过这里的第一个参数,也就是域一定要设置成AF_UNIX或AF_LOCAL,而不是普通TCP/IP套接字的AF_INET。第二个参数表示套接字的类型,分为流套接字(SOCK_STREAM)和数据包套接字(SOCK_DGRAM)。不同于普通的AF_INET的Socket,由于都是在本机通过内核通信,所以SOCK_STREAM和SOCK_DGRAM都是可靠的,不会丢包也不会出现发送包的次序和接收包的次序不一致的问题。它们的区别仅仅是,SOCK_STREAM无论发送多大的数据都不会被截断,而对于SOCK_DGRAM来说,如果发送的数据超过了一个报文的最大长度,则数据会被截断。而最后一个参数,表示协议,对于Unix域套接字来说,其一定是被设置成0。因此,一般通过下面的方式创建一个Unix域套接字:
int sockfd = socket(PF_LOCAL,SOCK_DGRAM, 0); // 数据包式套接字
2)bind()
对于流式套接字的服务器端来说,在用socket()函数获得了新创建套接字的文件描述符之后,还要将其绑定到一个地址上去:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
在Unix域套接字中,套接字的地址是以sockaddr_un结构体来表示的,其结构如下:
struct sockaddr_un {
sa_family_t sun_family;
char