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

2023-05-16

利用套接字创建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 }

程序运行效果

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 正则表达式(转载)

    正则表达式的基本语法 开始和结尾位置声明 表示字符串的开始 xff0c 要匹配 本身需要使用 例如 xff1a Yao 表示字符串以 Yao 开头 表示字符串的结尾 xff0c 要匹配 本身需要使用 例如 xff1a Yao 表示字符串以
  • apache2网站设置

    apache2网站设置 我们访问一个网址是先解析成对应的IP的80端口开始的 打开apache2网站配置文件 nano etc apache2 sites available 000 default conf 可以看到 lt Virtual
  • apache用户名和密码验证

    apache用户名和密码验证 之前建立的www soft com这个网站我们给他加个访问验证 修改 etc apache2 apache2 conf nano etc apache2 apache2 conf 把 lt Directory
  • php安装swoole插件

    swoole插件 安装wget apt install wget 安装openssl apt install openssl xff08 https要用到 安装phpize apt install php7 3 dev 安装make apt
  • 五:debian安装,附加审批系统

    如果你还没读第一篇和第二篇请阅读第一篇Debian 安装和第二篇Debian 服务器安装 服务器开始安装审批系统 wget c https jiaozhiguan 1258621244 cos ap guangzhou myqcloud c
  • SpringBoot项目的出现java.io.FileNotFoundException: (系统找不到指定的路径。)

    项目场景 xff1a SpringBoot项目的出现java io FileNotFoundException 系统找不到指定的路径 项目场景 xff1a Springboot用到文件上传下载功能 问题描述 xff1a 问题 xff1a j
  • mysql创建用户报错[Err] 1396 - Operation CREATE USER failed for ‘用户名‘@‘%‘的解决方法

    项目场景 xff1a 执行mysql创建用户语句CREATE USER test IDENTIFIED BY 用户名 问题描述 xff1a 执行mysql创建用户语句CREATE USER test IDENTIFIED BY 39 用户名
  • 解决nginx提示:(code=exited, status=203/EXEC)的错误

    项目场景 xff1a 在centos7上启动nginx1 19 安装过程省略 问题描述 xff1a 编译安装一切顺利 xff0c 使用systemctl start nginx时提示如下内容 xff1a span class token p
  • You don‘t have permission to access this resource.

    项目场景 xff1a 访问自己的搭建的网站时apache报错You don t have permission to access this resource 原因分析 遇到如标题那个问题 xff0c 无法进行远程HTTP请求 解决方案 x
  • cmd下windows批处理bat,获取当前系统时间,生成日志文件名

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 Window系统一 范例二 方法详解1 获取日期2 获取时间3 详解 总结更多 关于Linux的写法 Window系统 常用的Win
  • Centos 7 SSH服务安全加固

    描述 禁止SSH空密码用户登录 xff0c 限制可登录用户及来源地址 加固建议 编辑文件 etc ssh sshd config xff0c 将一应配置修改 具体操作命令和步骤 1 编辑文件 etc ssh sshd config vim
  • 第18章 异常处理

    问题 xff1a c 43 43 异常处理是不是必须有try xff0c 才能有catch 下面自己验证下 方法1 xff1a 如果没有try catch语句块能不能处理异常 xff1f include lt string gt inclu
  • Centos7十五项安全加固标准配置(结合等保3)

    写在前面 xff1a 由于所有操作均涉及系统文件 xff0c 建议所有操作前备份文件及做好相关记录 一 检查系统空密码账户 身份鉴别 描述 检查是否存在空口令和root权限的账号 加固建议 对无口令并且可登录的账户 xff0c 进行密码设置
  • ThinkPHP下 自定义日志输出

    项目场景 xff1a 不想调用TP的 think Log类工具 xff0c 而是自定义日志的输出路径 文件名和内容 xff1a 解决方案 xff1a 提示 xff1a 这里填写该问题的具体解决方案 xff1a 1 首先在common php
  • Ubuntu下代理设置方法

    Ubuntu下代理设置方法 一 临时的手段 在命令行中临时设置 xff0c export http proxy 61 34 http username password 64 proxyIP proxyPort 34 xff0c 和其他临时
  • 缓解pandas中DataFrame占用内存过大的问题

    本文最后修改于2018 01 21 xff0c 文章有问题或者转载请及时联系本人 xff0c 如果对你有帮助 xff0c 别忘了点下关注 0 背景 在我们使用pandas进行数据处理的时候 xff0c 有时候发现文件在本地明明不大 xff0
  • “智医助理”噱头>实用性?详解科大讯飞医疗新布局

    关注52AI xff0c 做AI的行业领先者 QQ人工智能行业交流群 xff1a 626784247 01 以456分通过执医考试的 智医助理 xff0c 真的能够用于临床辅助诊断吗 xff1f 在国际权威的肺结节检测大赛LUNA16中刷新
  • centos8上实现私有CA和证书申请颁发

    一 创建生成密钥文件 1 用下面这条命令查看这个路径下有没有文件 如果报错没有 span class token function ls span etc pki CA 2 就递归创建出以下文件 span class token funct
  • Linux下wifi工具wpa_cli使用

    wpa cli使用 扫描查看扫描结果添加network设置SSID选择某个network查看networks使能某个network查询连接情况自动分配IP地址API Demo 扫描 root 64 demo wpa cli i wlan0
  • Ubuntu18.04安装NVIDIA驱动后,无法调节屏幕亮度

    问题 xff1a 安装N卡驱动后 xff0c 系统自带的亮度调节条失效 解决方法 xff1a 1 安装brightness controller 安装后 xff0c 会出现打开一次之后 xff0c 软件后续再也无法启动的问题 xff0c 可

随机推荐