以下是一个基于 Linux 的 C 程序示例,展示了如何使用 Unix 域套接字(Unix domain socket)在不同进程之间互传 JSON 消息。我们将实现一个简单的客户端 - 服务器模型,服务器监听连接,客户端连接到服务器并发送 JSON 消息,服务器接收消息并打印出来,然后服务器也可以向客户端发送 JSON 消息。

服务器端代码(server.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <json-c/json.h>#define SOCKET_PATH "/tmp/my_socket"int main() {int server_fd, new_socket;struct sockaddr_un address;int opt = 1;int addrlen = sizeof(address);char buffer[1024] = {0};// 创建套接字if ((server_fd = socket(AF_UNIX, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// 设置套接字选项if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {perror("setsockopt");exit(EXIT_FAILURE);}address.sun_family = AF_UNIX;strcpy(address.sun_path, SOCKET_PATH);// 绑定套接字到指定路径if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 监听连接if (listen(server_fd, 3) < 0) {perror("listen");exit(EXIT_FAILURE);}printf("Server listening on %s...\n", SOCKET_PATH);// 接受客户端连接if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("accept");exit(EXIT_FAILURE);}// 接收客户端发送的 JSON 消息ssize_t valread = read(new_socket, buffer, 1024);if (valread < 0) {perror("read");exit(EXIT_FAILURE);}// 解析 JSON 消息json_object *parsed_json = json_tokener_parse(buffer);if (parsed_json == NULL) {printf("Failed to parse JSON\n");} else {printf("Received JSON: %s\n", json_object_to_json_string(parsed_json));json_object_put(parsed_json);}// 向客户端发送 JSON 消息json_object *response_json = json_object_new_object();json_object_object_add(response_json, "message", json_object_new_string("Hello from server!"));const char *response_str = json_object_to_json_string(response_json);send(new_socket, response_str, strlen(response_str), 0);json_object_put(response_json);// 关闭套接字close(new_socket);close(server_fd);unlink(SOCKET_PATH);return 0;
}

客户端代码(client.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <json-c/json.h>#define SOCKET_PATH "/tmp/my_socket"int main() {int sock = 0;struct sockaddr_un serv_addr;char buffer[1024] = {0};// 创建套接字if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {perror("socket creation error");return -1;}serv_addr.sun_family = AF_UNIX;strcpy(serv_addr.sun_path, SOCKET_PATH);// 连接到服务器if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {perror("Connection Failed");return -1;}// 创建 JSON 消息json_object *json_msg = json_object_new_object();json_object_object_add(json_msg, "message", json_object_new_string("Hello from client!"));const char *msg_str = json_object_to_json_string(json_msg);// 发送 JSON 消息send(sock, msg_str, strlen(msg_str), 0);json_object_put(json_msg);// 接收服务器的响应ssize_t valread = read(sock, buffer, 1024);if (valread < 0) {perror("read");return -1;}// 解析服务器的响应json_object *parsed_json = json_tokener_parse(buffer);if (parsed_json == NULL) {printf("Failed to parse JSON\n");} else {printf("Received JSON from server: %s\n", json_object_to_json_string(parsed_json));json_object_put(parsed_json);}// 关闭套接字close(sock);return 0;
}

编译和运行
1. 安装 json-c 库:
sh
sudo apt-get install
 libjson-c-dev

2. 编译服务器端和客户端代码:
sh
gcc server.c -o
 server -ljson-c
gcc client.c 
-o
 client -ljson-c

3. 先运行服务器:
sh
./server

4. 再运行客户端:
sh
./client

代码说明
• 服务器端:创建一个 Unix 域套接字,绑定到指定路径,监听连接,接受客户端连接,接收客户端发送的 JSON 消息,解析并打印该消息,然后向客户端发送一条 JSON 响应消息。
• 客户端:创建一个 Unix 域套接字,连接到服务器,创建一个 JSON 消息并发送给服务器,接收服务器的响应消息,解析并打印该消息。
通过这种方式,不同进程之间可以使用 Unix 域套接字互传 JSON 消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87839.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87839.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/87839.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高云GW5AT-LV60 FPGA图像处理板|MIPI摄像头帧率测试

高云GW5AT-LV60 FPGA图像处理板套件中附带了三个摄像头模组&#xff0c;这三个模组真是各有千秋&#xff0c;接下来我通过简单的一些测试来看看这几个摄像头的差异。 VS-SC130GS 、 VS-SC2210 这两个模组是手动对焦&#xff0c;在使用时需要手动转动镜头调整焦距&#xff0c;这…

机器学习在智能能源管理中的应用:需求响应与可再生能源整合

随着全球能源需求的不断增长和环境问题的日益突出&#xff0c;智能能源管理成为实现可持续发展的关键。智能能源管理系统通过整合先进的信息技术&#xff0c;如物联网&#xff08;IoT&#xff09;、大数据和机器学习&#xff0c;能够优化能源的分配和使用&#xff0c;提高能源效…

【网络】Linux 内核优化实战 - net.ipv4.tcp_timestamps

目录 net.ipv4.tcp_timestamps 详解1. 功能与作用2. 参数取值与含义3. 启用/禁用的影响4. 配置方法5. 适用场景建议6. 注意事项总结 net.ipv4.tcp_timestamps 详解 net.ipv4.tcp_timestamps 是 Linux 内核中一个与 TCP 协议相关的网络参数&#xff0c;用于控制是否启用 TCP 时…

第一个Flink 程序:词频统计 WordCount(流处理)

本文重点 本文将通过一个统计词频的小程序来看一下flink是如何对数据进行批处理的,需要声明的是,一般我们使用Flink常常用于流式处理,即使是有界的数据,我们也将其看成是无界数据进行流式处理,所以批量处理并不是很常用,这里只是为了了解一下Flink是如何进行批处理的。 …

在 Kodi 中添加 AList 搭建 WebDav 的方法

文章目录 一、问题背景二、使用方法&#xff08;一&#xff09;开启 AList 的 WebDav&#xff08;二&#xff09;在 Kodi 添加 WebDav1. 打开设置跳转到媒体设置添加指定类型的媒体库2. 选择添加媒体库3. 添加新的网络位置 一、问题背景 AList 是一种使用 Gin 和 Solidjs 编写…

DAY 49

CBAM 是一种能够集成到任何卷积神经网络架构中的注意力模块。它的核心目标是通过学习的方式&#xff0c;自动获取特征图在通道和空间维度上的重要性&#xff0c;进而对特征图进行自适应调整&#xff0c;增强重要特征&#xff0c;抑制不重要特征&#xff0c;提升模型的特征表达能…

LLM:位置编码详解与实现

文章目录 前言一、绝对位置编码二、相对位置编码三、旋转位置编码 前言 由于attetnion运算的特性&#xff0c;Transformer本身不感知顺序&#xff0c;位置编码是弥补这一缺陷的关键。 一、绝对位置编码 绝对位置编码的方式是通过将每个位置映射到一个高维空间中&#xff0c;该…

pytorch学习-10.卷积神经网络(基础篇)

2.线性模型 3.梯度下降算法 4.反向传播(用pytorch算梯度) 5.用pytorch实现线性回归 6.logistic回归 7.处理多维特征的输入 8.加载数据集 9.多分类问题 10.卷积神经网络&#xff08;基础篇&#xff09;_哔哩哔哩_bilibili 10.1卷积神经网络 10.1.1 卷积神经网络工作流程&…

ARMv8 创建1、2、3级页表代码与注释

对下面的地址空间创建3级页表 // level 1 table, 4 entries: // 0000 0000 - 3FFF FFFF, 1GB block, DDR // 4000 0000 - 7FFF FFFF, 1GB block, DDR // 8000 0000 - BFFF FFFF, 1GB block, DDR // C000 0000 - FFFF FFFF, point to level2 tabel // // level 2 table, 512 en…

DeepSeek-R1满血版:硅基流动API或本地部署

大家好! 想在手机上部署 DeepSeek-R1 满血版&#xff08;671B&#xff09;&#xff1f;我来手把手教你最靠谱的两种方式&#xff01;满血版模型参数高达 671 亿&#xff0c;手机本地运行几乎不可能&#xff0c;但通过「云服务 手机 App」的组合&#xff0c;你一样能在手机上丝…

React 各颜色转换方法、颜色值换算工具HEX、RGB/RGBA、HSL/HSLA、HSV、CMYK

&#x1f4d6; 简介 基于 React Tailwind CSS 构建的专业颜色转换工具&#xff0c;支持多种颜色格式的实时转换。无论是设计师、开发者&#xff0c;都能在这个工具中找到所需的颜色转换功能。 ✨ 核心功能 &#x1f3af; 多格式颜色转换 HEX 格式: 支持 3 位缩写 (#000, #…

开关电源抄板学习

一、实物 输入220V&#xff0c;输出12V5A 二、拍照并使用PS矫正 用卡尺测量下PCB的尺寸&#xff0c;在PS中作为画布。 用相机拍下照片&#xff0c;导入到PS中&#xff0c;用拉伸工具对图片进行矫正处理&#xff0c;并拉伸到和画布一样大小。 三、打开嘉立创EDA&#xff0c;导…

大数据在UI前端的应用探索:基于用户行为分析的产品优化策略

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 一、引言&#xff1a;用户行为分析重构产品优化的技术逻辑 在数字化产品体验竞争日益激烈的今…

优化 WebSocket 实现单例连接用于打印【待测试 】

class PrinterWebSocket { constructor(url) { if (PrinterWebSocket.instance) { return PrinterWebSocket.instance; } this.url url; this.socket null; this.queue []; // 打印任务队列 this.isConnecting false; this.retry…

Spring Cloud Alibaba/Spring Boot整合华为云存储实例(REST API方式)

一个小作业&#xff0c;初次尝试华为云存储&#xff0c;一点分享 原项目采用Spring Cloud Alibaba微服务技术、Spring Boot框架技术、VueJS前端框架开发技术&#xff0c;nacos注册中心&#xff0c;数据库为mysql 下面看一下没有运用云存储的原项目&#xff08;可跳过&#xf…

Petalinux工程如何离线编译

目录 一.下载离线包 1.1 共享状态缓存包&#xff1a;sstate-cache 1.1.1 进入官网打开Petalinux工具网页 1.1.2 找到相应的Petalinux版本 1.1.3 根据平台下载 1.2 下载downloads源码包 1.3 open_components源码包 二.解压 2.1 sstate-cache 2.2 downloads源码包 2.3…

w446数字化农家乐管理平台的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

AWS WebRTC:通过shell分析viewer端日志文件

在并发过程中,每个viewer会产生一个对应的日志文件,日志文件名为: viewer_channel_index_20250626_030943_145.logviewer端日志比master端日志文件数量多,比例大概是5:1,有1个master就会有5个viewer,每个viewer对应一个日志文件。 我要统计的是从启动viewer到出第一帧视…

时间转换——借助时间模块time

两种时间戳类型 例如s11704879917000 1、13位的时间戳&#xff1a;单位&#xff08;毫秒&#xff09; &#xff08;1&#xff09;毫秒变成秒&#xff0c;1s1000ms&#xff0c;s1/1000&#xff08;秒&#xff09; &#xff08;2&#xff09;加载时间 times time.localtime(…

LabVIEW MathScript薄板热流模拟

热流模拟是热设计关键环节&#xff0c;传统工具精准但开发周期长&#xff0c;本 VI 利用 LabVIEW 优势&#xff0c;面向工程师快速验证需求&#xff0c;在初步方案迭代、教学演示等场景更具效率&#xff0c;为热分析提供轻量化替代路径&#xff0c;后续可结合专业工具&#xff…