1. 域套接字:
(1) 只能用于同一设备上不同进程之间的通信;
(2) 效率高于网络套接字。域套接字仅仅是复制数据,并不走协议栈;
(3) 可靠,全双工;
2. 域套接字地址结构:
struct
sockaddr_un {
sa_family_t sun_family;
/*
AF_UNIX
*/
char sun_path[108]; /*pathname*/
};
当我们将一个地址绑定至域套接字,系统用该路径名创建一个类型为S_IFSOCK的文件,尽告诉客户端名字,不能打开,也不能通信,
不会自动删除,需要程序完成后删除,若文件已存在则bind失败;
3. 测试代码:
server.c
1 #include <sys/types.h>
2 #include <sys/socket.h>
3 #include <sys/un.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 7#define UN_PATH "/var/tmp/test_domain_socket"
8 910int main(int argc, char *argv[])
11{
12int sockfd = -1;
13struct sockaddr_un un;
14int len = 0;
1516if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
17 perror("create socket errorn");
18goto _ERROR;
19 }
2021 memset(&un, 0, sizeof(un));
22 un.sun_family = AF_UNIX;
23 strcpy(un.sun_path, UN_PATH);
2425 len = sizeof(un.sun_family) + sizeof(un.sun_path);
2627if (bind(sockfd, (struct sockaddr *)&un, len) < 0){
28 perror("socket bind errorn");
29goto _ERROR;
30 }
3132if (listen(sockfd, 5) < 0){
33 perror("socket listen errorn");
34 }
3536int conn = accept(sockfd, (struct sockaddr *)&un, &len);
37if (conn < 0){
38 perror("accept errorn");
39goto _ERROR;
40 }
41char buf[64] = {0};
42int n = read(conn, buf, 63);
43 printf("recive-msg:%s", buf);
44 write(conn, buf, n);
45 close(conn);
4647 close(sockfd);
48 unlink(UN_PATH);
49return0;
5051_ERROR:
52if (sockfd != -1){
53 close(sockfd);
54 }
5556return -1;
57 }
client.c
1 #include <sys/types.h>
2 #include <sys/socket.h>
3 #include <sys/un.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <unistd.h>
7 8#define UN_PATH "/var/tmp/test_domain_socket"
91011int main(int argc, char *argv[])
12{
13int sockfd = -1;
14struct sockaddr_un un;
15int len = 0;
1617if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
18 perror("create socket errorn");
19goto _ERROR;
20 }
2122 memset(&un, 0, sizeof(un));
23 un.sun_family = AF_UNIX;
24 strcpy(un.sun_path, UN_PATH);
2526 len = sizeof(un.sun_family) + sizeof(un.sun_path);
2728if (connect(sockfd, (struct sockaddr *)&un, len) < 0){
29 perror("socket connect errorn");
30goto _ERROR;
31 }
3233char buf[64] = {0};
34int n = read(STDIN_FILENO, buf, 63);
35 write(sockfd, buf, n);
36 printf("send-msg:%s", buf);
37 read(sockfd, buf, 63);
38 buf[64] = ‘