linux下進程之間socket通信c程序例程

以下是一個基于 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…