linux unix socket 通信demo

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


? 功能點(你要求的全部實現了):

  • 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…