好,下面是已经整合完善的版本:


✅ 功能点(你要求的全部实现了):

  • Unix Domain Socket (SOCK_STREAM)
  • 服务端先启动:正常通信
  • 客户端先启动:等待服务端直到连接成功
  • 客户端每秒发送一条消息
  • 服务端收到后打印并原样回传
  • 服务端断开后,客户端自动重连继续通信
  • 稳定循环运行

📁 项目结构

unix_socket_loop/
├── server.c
└── client.c

✅ server.c(服务端)

// server.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include <signal.h>#define SOCKET_PATH "/tmp/mysocket"
#define BUFFER_SIZE 128int server_fd = -1;void cleanup() {if (server_fd != -1) close(server_fd);unlink(SOCKET_PATH);printf("Server cleanup done.\n");exit(0);
}int main() {signal(SIGINT, cleanup); // Ctrl+C 退出时清理struct sockaddr_un addr;char buffer[BUFFER_SIZE];// 创建 socketserver_fd = socket(AF_UNIX, SOCK_STREAM, 0);if (server_fd == -1) {perror("socket");exit(EXIT_FAILURE);}unlink(SOCKET_PATH); // 清除旧 socket 文件memset(&addr, 0, sizeof(addr));addr.sun_family = AF_UNIX;strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1);// bind & listenif (bind(server_fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {perror("bind");exit(EXIT_FAILURE);}if (listen(server_fd, 5) == -1) {perror("listen");exit(EXIT_FAILURE);}printf("Server is listening at %s ...\n", SOCKET_PATH);while (1) {int client_fd = accept(server_fd, NULL, NULL);if (client_fd == -1) {perror("accept");continue;}printf("Client connected.\n");while (1) {memset(buffer, 0, BUFFER_SIZE);ssize_t len = read(client_fd, buffer, BUFFER_SIZE - 1);if (len <= 0) {printf("Client disconnected.\n");close(client_fd);break;}printf("Server received: %s\n", buffer);write(client_fd, buffer, strlen(buffer)); // 回传}}cleanup();
}

✅ client.c(客户端)

// client.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include <errno.h>#define SOCKET_PATH "/tmp/mysocket"
#define BUFFER_SIZE 128int connect_to_server() {int fd = socket(AF_UNIX, SOCK_STREAM, 0);if (fd == -1) {perror("socket");return -1;}struct sockaddr_un addr;memset(&addr, 0, sizeof(addr));addr.sun_family = AF_UNIX;strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1);while (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {printf("Waiting for server... (%s)\n", strerror(errno));sleep(1);}printf("Connected to server.\n");return fd;
}int main() {char buffer[BUFFER_SIZE];int counter = 0;int client_fd = connect_to_server();if (client_fd < 0) {fprintf(stderr, "Failed to connect.\n");return EXIT_FAILURE;}while (1) {snprintf(buffer, BUFFER_SIZE, "Hello %d", counter++);if (write(client_fd, buffer, strlen(buffer)) == -1) {perror("write");close(client_fd);printf("Connection lost. Reconnecting...\n");client_fd = connect_to_server();continue;}memset(buffer, 0, BUFFER_SIZE);ssize_t len = read(client_fd, buffer, BUFFER_SIZE - 1);if (len <= 0) {printf("Server disconnected. Reconnecting...\n");close(client_fd);client_fd = connect_to_server();continue;}printf("Client received: %s\n", buffer);sleep(1);}close(client_fd);return 0;
}

✅ 编译和运行

gcc server.c -o server
gcc client.c -o client

运行服务端(终端1):

./server

可以先或后运行客户端(终端2):

./client

✅ 测试行为

测试行为结果
先运行 client等待 server 启动后自动连接
server 崩溃后重新启动client 会自动重连继续发数据
server 收到后打印并回传正常
client 每秒发送一条数据正常

✅ 下一步推荐扩展(可选):

  • 多客户端并发支持(server 用 forkselect
  • 消息使用 TLV 或 JSON
  • 增加超时处理或心跳机制
  • 加日志输出和守护进程运行

如需我帮你扩展支持多客户端并发或改成 select 多路复用的,直接说即可。

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

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

相关文章

近期GitHub热榜推荐

【1】fluentui-system-icons (HTML) &#x1f468;‍&#x1f4bb; 作者&#xff1a; microsoft &#x1f4e6; 仓库&#xff1a; microsoft / fluentui-system-icons &#x1f310; 链接&#xff1a; https://github.com/microsoft/fluentui-system-icons ⭐ 星标&#xf…

Jupyter 是什么?基于浏览器的交互式计算环境

&#x1f9e0; 一、Jupyter 是什么&#xff1f; Jupyter 是一个基于浏览器的交互式计算环境&#xff0c;名字取自Julia Python R 三种语言&#xff0c;但现在已支持超过40种编程语言。它最核心的功能是让你在同一个文档&#xff08;.ipynb 文件&#xff09;中混合编写代码、…

CTF解题:[NSSCTF 2022 Spring Recruit]弱类型比较绕过

一、漏洞背景介绍 在 CTF&#xff08;Capture The Flag&#xff09;竞赛和 Web 安全测试中&#xff0c;PHP 语言的类型比较漏洞是常见的考点。这类漏洞源于 PHP 的弱类型特性&#xff0c;即当使用进行比较时&#xff0c;PHP 会自动进行类型转换&#xff0c;从而导致一些不符合…

【SQL】存储过程 vs 普通 SQL

一、存储过程 vs 普通 SQL 的核心区别 先明确两者的本质&#xff1a; 普通 SQL&#xff1a;是直接执行的查询 / 操作语句&#xff08;如SELECT、INSERT&#xff09;&#xff0c;每次执行都要编译&#xff0c;逻辑写在应用端或直接运行。存储过程&#xff1a;是预编译并存储在…

Vue.js第一节

初识Vue、插值操作、属性绑定 初识&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>D…

前端打断点

这个按钮有个点击事件&#xff0c;然后点击这个js 即可进入到代码中 如果这时想打一些临时的表达式&#xff0c;可以按esc弹出console控制台&#xff0c; 右上角有可以使用的变量

Jmeter接口测试与性能测试

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 目前最新版本发展到5.0版本&#xff0c;需要Java7以上版本环境&#xff0c;下载解压目录后&#xff0c;进入\apache-jmeter-5.0\bin\&#xff0c;双击ApacheJMete…

如何利用大模型搭建本地知识库

要利用大模型搭建本地知识库&#xff0c;核心在于&#xff1a;构建高质量知识内容源、使用向量化技术实现语义检索、部署大语言模型以实现自然语言问答接口、设计本地知识库的数据更新机制、注重隐私与合规性控制。其中&#xff0c;使用向量化技术实现语义检索至关重要&#xf…

vscode连接不上服务器问题修复

原因&#xff1a;运维人员修复漏洞&#xff0c;升级了服务器openssh版本&#xff0c;导致无法新建连接连上vscode 操作&#xff1a; 1.删除云桌面上C:\Users\.ssh 路径下known_hosts文件&#xff1b; 2.设置免密登录 1&#xff09;执行 ssh-keygen -t rsa -C "your_em…

架构优化——submodule转为subtree

文章目录 背景subtree优势submodule切换到subtree脚本subtree使用切开发分支推送代码同步代码 背景 submodule过多&#xff0c;目前20个submodule需要切出20个分支&#xff0c;查看提交记录、切分支等使用起来麻烦。 团队深受困扰&#xff01; subtree优势 继承submodule的…

车载软件架构 --- 汽车中央控制单元HPC软件架构方案实例

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

零基础开始的网工之路第二十一天------性能优化

目录 一、性能优化概述 二、性能监控工具 1. 基础工具 2. 高级工具 三、子系统优化策略 1. CPU优化 2. 内存优化 3. 磁盘I/O优化 4. 网络优化 四、资源限制优化 1. ulimit 2. cgroups&#xff08;控制组&#xff09; 五、安全与注意事项 六、综合案例 案例1&…

【Google Chrome】谷歌浏览器历史版本下载

最新版&#xff1a; Chrome for Testing availability 谷歌浏览器 Chrome 最新版离线安装包下载地址 v137.0.7151.104 - 每日自动更新 | 异次元软件 历史版本&#xff1a; Download Google Chrome 105.0.5195.102 for Windows - Filehippo.com chrome浏览器,chrome插件,谷…

线性表实训(头歌实践平台课程答案详细解说)

C 和 C 支持 4 种基本数据类型&#xff08;整型、浮点型、字符型、布尔型&#xff09;和 3 种复合型数据类型&#xff08;数组、指针、结构&#xff09;。复合类型的数据对于数据结构至关重要&#xff0c;因为从某种程度上来说数据量的多少和数据结构的好坏决定了程序的复杂程度…

【前端】threeJS学习(长期更新)

简介 Three.js是用JavaScript编写的第三方库&#xff0c;用于实现3D功能&#xff0c;基于WebGL进行封装。 一个3D模型的建立主要由以下几个部分组成&#xff08;基本版&#xff09;&#xff1a; * 创建场景scene--相机camera--渲染器renderer--(灯光light)&#xff1b; *…

Linux系统--权限

大家好&#xff0c;上一次我们学习了关于Linux中的基础指令&#xff0c;那么我们今天来继续学习Linux的新的内容&#xff1a;权限。那么话不多说&#xff0c;我们开始今天的学习&#xff1a; 目录 Linux权限 1. Linux权限的概念 2. Linux权限管理 3. ⽂件权限值的表⽰⽅法…

论文笔记 <交通灯> <多智能体>DERLight双重经验回放灯机制

今天看的论文是这篇 主要提出了传统优先级经验回放&#xff08;PER&#xff09;在复杂交通场景中效率低下&#xff0c;使用二叉树存储样本&#xff0c;导致大规模样本时计算复杂度高。而且不丢弃样本&#xff0c;造成存储空间浪费。 双重经验池&#xff1a; 为了解决以上问题…

Chromium 136 编译指南 macOS篇:环境准备与系统配置(一)

1. 引言 在浏览器技术的星空中&#xff0c;Chromium 犹如一颗最亮的明星&#xff0c;照亮了整个互联网的发展轨迹。作为推动现代 Web 技术革命的核心引擎&#xff0c;Chromium 不仅是 Google Chrome 的技术基石&#xff0c;更是 Microsoft Edge、Opera、以及众多定制浏览器的共…

linux机器间无密码如何传输文件

1. scp传输时的问题 $ scp deepseek_r1_distill_qwen1.5b_content_audit_fp16_20250613_2_Q4_K_M.gguf xxx192.168.xxx:/home/xxx/pretrained_model/output The authenticity of host 192.168.xxx (192.168.xxx) cant be established. ED25519 key fingerprint is SHA256:deOs…

PySpark 使用pyarrow指定版本

背景说明 在 PySpark 3.1.3 环境中&#xff0c;当需要使用与集群环境不同版本的 PyArrow (如 1.0.0 版本)时&#xff0c;可以通过以下方法实现&#xff0c;而无需更改集群环境配置 完整操作说明 去pyarrowPyPI下载对应版本的whl文件后缀whl直接改成zip解压后有两个文件夹&am…