Unxi域套接字并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API就是在不同主机上执行客户/服务器通信所用的API。可以视为IPC方法之一。
UNix域提供两类套接字: 字节流套接字(类似TCP), 数据报套接字(类似UDP)
使用Unix域套接字有以下三个理由:
1、Unix域套接字往往比通信两端位于同一主机的TCP套接字快出一倍。X Window System发挥了Unix域套接字的这个优势。当一个X11客户打开到一个X11服务器的连接时,该客户检查DISPLAY环境变量的值(其中指定服务器的主机名,窗口和屏幕)。如果服务器和客户处于同一主机,客户就打开一个到服务器的Unix域套接字字节流连接,否则打开一个到服务器的TCP连接。
2、 Unix域套接字可用于在同一主机上的不同进程之间传递描述符
3、unix域套接字较新的实现把客户的凭证提供给服务器,从而能提供额外的安全检查措施。
Unix域中用于标识客户和服务器的协议地址是普通文件系统中的路径名。
Unix域套接字地址结构
下面给出一个例子,Unix域的套接字的bind调用
以下为结果
如果我们没有使用unlink,那么在文件已存在条件下重复上述指令:
使用Unix域套接字的
UNix域提供两类套接字: 字节流套接字(类似TCP), 数据报套接字(类似UDP)
使用Unix域套接字有以下三个理由:
1、Unix域套接字往往比通信两端位于同一主机的TCP套接字快出一倍。X Window System发挥了Unix域套接字的这个优势。当一个X11客户打开到一个X11服务器的连接时,该客户检查DISPLAY环境变量的值(其中指定服务器的主机名,窗口和屏幕)。如果服务器和客户处于同一主机,客户就打开一个到服务器的Unix域套接字字节流连接,否则打开一个到服务器的TCP连接。
2、 Unix域套接字可用于在同一主机上的不同进程之间传递描述符
3、unix域套接字较新的实现把客户的凭证提供给服务器,从而能提供额外的安全检查措施。
Unix域中用于标识客户和服务器的协议地址是普通文件系统中的路径名。
Unix域套接字地址结构
struct sockaddr_un{
sa_family sun_family; //AF_LOCAL
char sun_path[104]; //必须以空字符结尾
};
下面给出一个例子,Unix域的套接字的bind调用
#include "unp.h"
int main(int ac, char *av[])
{
int sockfd;
socklen_t len;
struct sockaddr_un addr1, addr2;
if(ac != 2)
{
fprintf(stderr,"Usage : xxx <pathname>");
exit(1);
}
if((sockfd=socket(AF_LOCAL,SOCK_STREAM,0)) < 0)
oops("socket error");
unlink(av[2]); //如果系统中已经存在了该路径名,bind将会调用失败,返回Already in use错误,为此我们先删除它。如果文件不存在,我们也不去管unlink 返回的错误
bzero(&addr1, sizeof(addr1));
addr1.sun_family = AF_LOCAL;
strncpy(addr1.sun_path, av[1], sizeof(addr1.sun_path)-1);
if(bind(sockfd, (struct sockaddr *)&addr1, SUN_LEN(&addr1)) < 0)
oops("bind error");
len = sizeof(addr2);
if(getsockname(sockfd, (struct sockaddr *)&addr2, &len) < 0)
oops("getsockname error");
printf("bound name = %s, returned len = %d\n",addr2.sun_path, len);
return 0;
}
以下为结果
./USB /tmp/moose
bound name = /tmp/moose, returned len =13
如果我们没有使用unlink,那么在文件已存在条件下重复上述指令:
./USB /tmp/moose
bind error: Address already in use
使用Unix域套接字的