UNIX域套接字
(部分转于:UNIX域协议(命名套接字))
一、什么是UNIX域套接字?
Unix域协议并不是实际的协议族,而是在单个主机上执行客户端与服务器端通信的一种方式。 是进程间通信的一种方式。常用于前后台进程通信。
其提供两种套接字:字节流套接字(类似于TCP),数据报套接字(类似UDP)
但Unix域数据域服务是可靠的,不会丢失信息,不会传递出错。
IP协议标识客户服务器是通过IP地址和端口号实现的,UNIX域协议中用于标识客户机和服务器的协议地址的是普通文件系统中的路径名。
二、UNIX域协议特点
1)UNIX域套接字域TCP套接字相比,在同一台主机的传输速度前者是后者的两倍。UNIX域套接字仅仅复制数据,并不执行协议处理,不需要添加或删除网络报头,无需计算校验和,不产生顺序号,也不需要发送确认报文
2)UNIX域套接字可以在同一台主机上各进程之间传递文件描述符
3)UNIX域套接字域传统套接字的区别是用路径名表示协议族的描述
三、UNIX域地址结构
1 #include <sys/socket.h> 2 #include <sys/un.h> 3 4 unix_socket = socket(AF_UNIX, type, 0); 5 error = socketpair(AF_UNIX, type, 0, int *sv);
1 /**************本地地址结构*****************/ 2 #define UNIX_PATH_MAX 108 // <sys/un.h> 3 struct sockaddr_un{ 4 sa_family_t sun_family; // AF_UNIX 或者 AF_LOCAL 5 char sun_path[UNIX_PATH_MAX];
//path name,文件路径名(必须事先不存在,一般是绝对路径) 6 }; 7 8 /****************填充地址结构***************/ 9 struct sockaddr_un myaddr; 10 bzero(&myaddr, sizeof(myaddr)); 11 myaddr.sun_family = AF_UNIX; 12 strcpy(myaddr.sun_path, "/tmp/mysocket");
四、Unix域套接字编程
服务器端 客户端
注意:在编程时,要先bind()在socket Unix的结构体变量
Server:先创建套接字 -> 绑定地址 -> 监听 -> accept 客户端连接 -> 连接成功开始通信 -> 关闭套接字
Client:先创建套接字 -> 连接server -> 开始通信 -> 关闭套接字