linux 本地套接字通信

本地套接字的作用:本地的进程间通信

  有关系的进程间通信

  没有关系的进程间的通信

  本地套接字实现流程与网络套接字类似,一般采用 TCP 通信流程

本地套接字通信流程:

复制代码
//服务器端
//1.创建监听的套接字
    int lfd = socket(AF_UNIX/AF_LOCAL, SOCK_STREAM, 0);
//2.监听的套接字绑定本地的套接字文件 -> server端
    struct sockaddr_un addr;
    //绑定成功后,指定的 sun_path中的套接字文件会自动生成 
    bind(lfd, addr, len);
//3.监听
    listen(lfd, 100);
//4.等待并接受连接请求
    struct sockaddr_un cliaddr;
    int cfd = accept(lfd, cliaddr, len);
//5.通信
    接受数据: read/recv
    发送数据: write/send
//6.关闭连接
    close();

//客户端流程
//1.创建通信的套接字
    int fd = socket(AF_UNIX/AF_LOCAL, SOCK_STREAM, 0);
//2.监听的套接字绑定本地的 IP 端口
    struct sockaddr_un addr;
    //绑定成功之后,指定的sun_path中套接字文件会自动生成
    bind(lfd, addr, len);
//3.连接服务器
    struct sockaddr_un serveraddr;
    connect(fd, &serveraddr, sizeof(serveraddr));
//4.通信
    接受数据: read/recv
    发送数据: write/send
//5.关闭连接
    close();
复制代码

本地客户端:

复制代码
 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <string.h>
 4 #include <stdlib.h>
 5 #include <arpa/inet.h>
 6 #include <sys/un.h>
 7 
 8 int main()
 9 {
10     unlink("client.sock");
11     //1.创建套接字
12     int cfd = socket(AF_LOCAL, SOCK_STREAM, 0);
13     if(cfd == -1)
14     {
15         perror("socket");
16         exit(-1);
17     }
18     //2.绑定本地套接字文件
19     struct sockaddr_un addr;
20     addr.sun_family = AF_LOCAL;
21     strcpy(addr.sun_path, "client.sock");
22     int ret =bind(cfd, (struct sockaddr *)&addr,sizeof(addr));
23     if(ret == -1)
24     {
25         perror("bind");
26         exit(-1);
27     }
28     //3.连接服务器
29     struct sockaddr_un seraddr;
30     seraddr.sun_family = AF_LOCAL;
31     strcpy(seraddr.sun_path, "server.sock");
32     ret = connect(cfd, (struct sockaddr *)&seraddr, sizeof(seraddr));
33     if(ret == -1)
34     {
35         perror("connect");
36         exit(-1);
37     }
38     //4.通信
39     int num = 0;
40     while(1)
41     {
42         //发送数据
43         char buf[128];
44         sprintf(buf, "hello, i am client: %d\n",num++);
45         send(cfd, buf, strlen(buf) + 1, 0);
46         printf("client say : %s\n", buf);
47         //接收数据
48         int len = recv(cfd, buf, sizeof(buf), 0);
49         if(len == -1)
50         {
51             perror("recv");
52             exit(-1);
53         }
54         else if(len == 0)
55         {
56             printf("server closed...\n");
57             break;
58         }
59         else if(len > 0)
60         {
61             printf("server say : %s\n", buf);
62             send(cfd, buf, len, 0);
63         }
64         sleep(1);
65     }
66     close(cfd);
67     return 0;
68 }
复制代码

本地服务器端:

复制代码
 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <string.h>
 4 #include <stdlib.h>
 5 #include <arpa/inet.h>
 6 #include <sys/un.h>
 7 
 8 int main()
 9 {
10     unlink("server.sock");//删除此文件 不删除重新连接报错地址已经使用
11     //1.创建监听的套接字
12     int lfd = socket(AF_LOCAL, SOCK_STREAM, 0);
13     if(lfd == -1)
14     {
15         perror("socket");
16         exit(-1);
17     }
18     //2.绑定本地套接字文件
19     struct sockaddr_un addr;
20     addr.sun_family = AF_LOCAL;
21     strcpy(addr.sun_path, "server.sock");
22     int ret =bind(lfd, (struct sockaddr *)&addr,sizeof(addr));
23     if(ret == -1)
24     {
25         perror("bind");
26         exit(-1);
27     }
28     //3.监听
29     ret = listen(lfd, 100);
30     if(ret == -1)
31     {
32         perror("listen");
33         exit(-1);
34     }
35     //4.等待客户端连接
36     struct sockaddr_un cliaddr;
37     int len = sizeof(cliaddr);
38     int cfd = accept(lfd, (struct sockaddr *)&cliaddr, &len);
39     if(cfd == -1)
40     {
41         perror("accept");
42         exit(-1);
43     }
44     printf("client socket filename: %s\n",cliaddr.sun_path);
45     //5.通信
46     while(1)
47     {
48         char buf[128];
49         int len = recv(cfd, buf, sizeof(buf), 0);
50         if(len == -1)
51         {
52             perror("recv");
53             exit(-1);
54         }
55         else if(len == 0)
56         {
57             printf("client closed...\n");
58             break;
59         }
60         else if(len > 0)
61         {
62             printf("client say : %s\n", buf);
63             send(cfd, buf, len, 0);
64         }
65     }
66     close(cfd);
67     close(lfd);
68     return 0;
69 }
复制代码

 

posted on   廿陆  阅读(58)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示