利用套接字创建本地socket文件完成本地进程间通信

利用套接字创建socket文件完成本地两个进程之间的通信,这里分为进程A和进程B

进程A

头文件

进程A里面首先是各种头文件:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <unistd.h>
  5 #include <sys/types.h>
  6 #include <sys/socket.h>
  7 #include <sys/un.h>

另外还另外定义了一个宏:

9 #define SOCK_FILE   "/tmp/sock"

在Linux中tmp目录是一个临时文件目录,所以这边将socket文件存放在这个临时文件目录下。

创建socket文件

进入主函数后,首先需要创建socket文件,若失败则打印失败原因。

11 int main()
 12 {
 13     //创建socket
 14     int sockfd = socket(AF_LOCAL,SOCK_DGRAM,0);
 15     if(0 > sockfd)
 16     {
 17         perror("socket");
 18         return -1;
 19     }

准备地址

创建完socket文件则需要准备地址,确保能与另一个进程连通,其中AF_LOCAL为通信类型,这里用的是本地通信。

 21     //准备地址
 22     struct sockaddr_un addr = {};
 23     addr.sun_family = AF_LOCAL;
 24     strcpy(addr.sun_path,SOCK_FILE);

绑定

然后使用bind函数来进行绑定,注意由于结构体类型不一样,这里需要用到一个强制类型转换(struct sockaddr*)&addr。

 26     //绑定
 27     if(bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)))
 28     {
 29         perror("bind");
 30         return -1;
 31     }

接收数据

由于本进程是接收另一个进程的消息,所以这边先创建一个字符类型的数组,然后不断读出socket文件内容并且打印出来,当读出quit时则通信结束。

 33     //接收数据
 34     char buf[1024] = {};
 35     for(;;)
 36     {
 37         int ret = read(sockfd,buf,sizeof(buf));
 38         if(0 > ret)
 39         {
 40             perror("read");
 41             return -1;
 42         }
 43         printf("read:%s\n",buf);
 44         if(0 == strcmp("quit",buf))
 45         {
 46             printf("通信完成!\n");
 47             break;
 48         }
 49     }

关闭socket文件

最后是关闭socket文件,并且删除socket这个文件

 51     //关闭socket
 52     close(sockfd);
 53     unlink(SOCK_FILE);
 54 }
      

进程B

进程B中的头文件、宏、创建函数和准备地址都与进程A一样

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <unistd.h>
  4 #include <sys/types.h>
  5 #include <sys/socket.h>
  6 #include <sys/un.h>
  7 
  8 #define SOCK_FILE   "/tmp/sock"
  9 
 10 int main()
 11 {
 12     //创建socket
 13     int sockfd = socket(AF_LOCAL,SOCK_DGRAM,0);
 14     if(0 > sockfd)
 15     {
 16         perror("socket");
 17         return -1;
 18     }
 19 
 20     //准备地址
 21     struct sockaddr_un addr = {};
 22     addr.sun_family = AF_LOCAL;
 23     strcpy(addr.sun_path,SOCK_FILE);

连接

然后是连接进程B到进程A的通信,失败则打印失败原因

 25     //连接
 26     if(connect(sockfd,(struct sockaddr*)&addr,sizeof(addr)))
 27     {
 28         perror("connect");
 29         return -1;
 30     }

发送数据

由于本进程是发送数据的,所以进行发送数据操作,不断写入socket文件,当输入quit时则通信结束

 32     //发送数据
 33     char buf[1024] = {};
 34     for(;;)
 35     {
 36         printf(">");
 37         gets(buf);
 38         int ret = write(sockfd,buf,strlen(buf)+1);
 39         if(0 > ret)
 40         {
 41             perror("write");
 42             return -1;
 43         }
 44         printf("read:%s\n",buf);
 45         if(0 == strcmp("quit",buf))
 46         {
 47             printf("通信完成!\n");
 48             break;
 49         }
 50     }

关闭socket文件

然后最后关闭socket文件

 52     //关闭socket
 53     close(sockfd);
 54 }

程序运行效果

在这里插入图片描述

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的使用本地套接字实现进程间通信的代码样例: **server.py** ```python import socket # 创建套接字对象 server_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) # 定义套接字文件路径 socket_file = "/tmp/my_socket" # 绑定套接字文件路径 server_socket.bind(socket_file) # 监听连接请求 server_socket.listen() while True: # 接受连接请求 client_socket, client_address = server_socket.accept() print(f"Connection from {client_address}") # 接收消息 message = client_socket.recv(1024) print(f"Received message: {message.decode()}") # 发送响应 response = "Hello from server" client_socket.send(response.encode()) # 关闭连接 client_socket.close() ``` **client.py** ```python import socket # 创建套接字对象 client_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) # 定义套接字文件路径 socket_file = "/tmp/my_socket" # 连接服务器 client_socket.connect(socket_file) # 发送消息 message = "Hello from client" client_socket.send(message.encode()) # 接收响应 response = client_socket.recv(1024) print(f"Received response: {response.decode()}") # 关闭连接 client_socket.close() ``` 在上述代码中,server.py 作为服务器端,首先创建一个套接字对象,并指定地址族为 UNIX 域套接字,类型为 SOCK_STREAM。然后,将套接字文件路径绑定到该套接字上,并开始监听连接请求。当有客户端连接请求时,接受连接请求,并接收客户端发送的消息。接收到消息后,向客户端发送响应,然后关闭连接。 而 client.py 作为客户端,同样创建一个套接字对象,并指定地址族为 UNIX 域套接字,类型为 SOCK_STREAM。然后,连接服务器,并发送消息。接收到服务器的响应后,打印响应内容,并关闭连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值