Unxi域套接字并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API就是在不同主机上执行客户/服务器通信所用的API。可以视为IPC方法之一。
UNix域提供两类套接字:字节流套接字(类似TCP),数据报套接字(类似UDP)
UNIX域协议特点:
1.Unix域套接字往往比通信两端位于同一主机的TCP套接字快出一倍。X Window System发挥了Unix域套接字的这个优势。当一个X11客户打开到一个X11服务器的连接时,该客户检查DISPLAY环境变量的值(其中指定服务器的主机名,窗口和屏幕)。如果服务器和客户处于同一主机,客户就打开一个到服务器的Unix域套接字字节流连接,否则打开一个到服务器的TCP连接。
2.Unix域套接字可用于在同一主机上的不同进程之间传递描述符
3.unix域套接字较新的实现把客户的凭证提供给服务器,从而能提供额外的安全检查措施。
4.Unix域套接字与传统套接字的区别是用路径名来表示协议族的描述。
域套接字比流式套接字快的原因?
UNIX域套接字用于同一台pc上运行的进程之间通信,它仅仅复制数据,不执行协议处理,不需要增加删除网络报头,无需计算校验和,不产生顺序号,无需发送确认报文。
UNIX域套接字地址结构
struct sockaddr_un{
sa_family sun_family; //AF_LOCAL,地址族
char sun_path[104]; //必须以空字符结尾,通过这样一个路径描述地址
};
UNIX域字节流回射客户/服务
服务端
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}while(0)
void echo_srv(int conn)
{
char recvbuf[1024];
int n;
while(1)
{
memset(recvbuf,0,sizeof(recvbuf));
//不断接收一行数据到recvbuf中
n=read(conn,recvbuf,sizeof(recvbuf));
if(n==-1)
{
if(n==EINTR)
continue;
ERR_EXIT("read");
}
//客户端关闭
else if(n==0)
{
printf("client close\n");
break;
}
fputs(recvbuf,stdout);
write(conn,recvbuf,strlen(recvbuf));
}
close(conn);
}
int main(void)
{
int listenfd;
//创建一个监听套接字
//它的协议家族是PF_UNIX,用流式套接字SOCK_STREAM
if((listenfd