当前位置:首页 > 操作系统 > Linux

Linux-进程间通信(四): 域套接字

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] = ;
39     printf("recv-msg:%s", buf);
4041    close(sockfd);
42return0;
4344_ERROR:
45if (sockfd != -1){
46        close(sockfd);
47    }
4849return -1;
50 }

 

原文:http://www.cnblogs.com/wanpengcoder/p/5303071.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐