Linux學習/TCP Socket通信

来源:https://www.cnblogs.com/songpoetry/p/18368018
-Advertisement-
Play Games

案例 案例一 server.c #include <stdio.h> // 標準輸入輸出 #include <stdlib.h> //提供通用的工具函數,例如記憶體分配和程式退出。 #include <string.h> //提供字元串處理函數。 #include <unistd.h> //提供對 P ...


案例

案例一

server.c

#include <stdio.h> // 標準輸入輸出
#include <stdlib.h> //提供通用的工具函數,例如記憶體分配和程式退出。
#include <string.h> //提供字元串處理函數。
#include <unistd.h> //提供對 POSIX 操作系統 API 的訪問,包括對文件描述符的操作。
#include <arpa/inet.h> //提供與 Internet 地址轉換相關的函數和數據結構。

#define PORT 8082 //PORT 是伺服器監聽的埠號,設置為 8082。
#define BUFFER_SIZE 1024 //定義了緩衝區的大小,用於接收數據,設置為 1024 位元組。

int main()
{
    int server_fd; //用於存儲伺服器套接字的文件描述符
    int new_socket; //客戶端連接的套接字描述符
    struct sockaddr_in address; //sockaddr_in 結構體,表示伺服器的地址信息。
    int opt = 1; //用於設置套接字選項(埠重用)。
    int addrlen = sizeof(address); //伺服器地址結構的大小。
    char buffer[BUFFER_SIZE] = {0}; //用於接收客戶端發送的消息,並初始化為零。

    /*使用 socket 函數創建一個套接字。參數 AF_INET 指定使用 IPv4,SOCK_STREAM 表示使用 TCP 協議。
     *如果創建失敗,函數返回值為 -1,輸出錯誤信息並退出程式。*/
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("server create failed\n");
        exit(EXIT_FAILURE);
    }

    /*使用 setsockopt 函數允許套接字重用地址。
     *設置選項 SO_REUSEADDR,這使得即使在套接字關閉後,新的套接字也可以綁定到同一埠。
     *如果設置選項失敗,輸出錯誤信息並退出程式。*/
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)))
    {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }

    // 配置伺服器地址結構
    address.sin_family = AF_INET; //設置 address 的地址家族為 AF_INET,表示 IPv4。
    // address.sin_addr.s_addr = INADDR_ANY; //使用 INADDR_ANY,表示伺服器將監聽所有可用的網路介面。
    /*將字元串格式的 IP 地址("127.0.0.1")轉換為二進位格式並存儲在 serv_addr.sin_addr 中。這個IP地址指的是本機。*/
    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0)
    {
        printf("\nInvalid address/ Address not supported \n");
        return -1;
    }
    address.sin_port = htons(PORT);//將主機位元組序轉換為網路位元組序,以確保在不同平臺上埠號的正確性。

    /*使用 bind 函數將套接字與指定的地址(包含 IP 和埠)進行綁定。如果綁定失敗,輸出錯誤信息並退出程式。*/
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0)
    {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    /*使用 listen 函數使套接字進入監聽狀態,準備接受客戶端連接。第二個參數指定最大等待連接的數量(3)。
     *如果監聽失敗,輸出錯誤信息並退出程式。*/
    if (listen(server_fd, 3) < 0)
    {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    printf("等待連接...\n");
    /*使用 accept 函數接受來自客戶端的連接。如果接受失敗,輸出錯誤信息並退出程式。
     *成功後,new_socket 用於與客戶端進行通信。*/
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0)
    {
        perror("accept");
        exit(EXIT_FAILURE);
    }

    /*使用 read 函數從與客戶端連接的套接字讀取數據,存儲到 buffer 中,最多接收 BUFFER_SIZE 位元組的數據。*/
    read(new_socket, buffer, BUFFER_SIZE);
    printf("接收到消息: %s\n", buffer);

    // 發送回應給客戶端
    const char *msg = "Hello from server";
    /*使用 send 函數將這個消息發送到客戶端,傳入消息長度(strlen(msg))和標誌參數(這裡為 0)。*/
    send(new_socket, msg, strlen(msg), 0);

    /*使用 close 函數關閉與客戶端的套接字(new_socket),釋放相應的資源。
     *關閉伺服器套接字(server_fd),釋放相應的資源。*/
    close(new_socket);
    close(server_fd);
    return 0;
}

client.c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <arpa/inet.h> 

#define PORT 8082 
#define BUFFER_SIZE 1024 

int main()
{
    int sock = 0;
    struct sockaddr_in serv_addr;
    char *message = "Hello from client";
    char buffer[BUFFER_SIZE] = {0};

    // 創建套接字
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("\n Socket creation error \n");
        return -1;
    }

    // 配置伺服器地址結構
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);

    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0)
    {
        printf("\nInvalid address/ Address not supported \n");
        return -1;
    }

    // 連接到伺服器
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
        printf("\nConnection Failed \n");
        return -1;
    }

    // 發送消息到伺服器
    send(sock, message, strlen(message), 0);
    printf("消息已發送\n");

    // 接收伺服器消息
    read(sock, buffer, BUFFER_SIZE);
    printf("接收到回應: %s\n", buffer);

    // 關閉套接字
    close(sock);
    return 0;
}

終端執行結果
先執行server打開監聽,再執行client開始連接

本文來自博客園,作者:BN宋,轉載請註明原文鏈接:https://www.cnblogs.com/songpoetry/p/18368018


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 WaterCloud 是一個集成了 LayUI 的高效敏捷開發框架,專為 .NET 開發者設計。 它不僅支持多種 .NET 版本(.NET 4.5、.NET Core 3.1、.NET 5、.NET 6),還內置了豐富的功能,如許可權管理、流程表單設計以及多資料庫支持下的多租戶架構。使用了 OR ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他們的系統出現了CPU 100%的情況,讓我幫忙看一下怎麼回事?dump也拿到了,本想著這種情況讓他多抓幾個,既然有了就拿現有的分析吧。 二:WinDbg 分析 1. 為什麼會爆高 既然說是 100%,作為調試者得拿數據說話,可以使用 !tp 來觀測一 ...
  • Docker部署.netCore6 第一步:在項目添加Docker支持 第二步:選擇Windows(如果是linx系統就選擇linx)和Dockerfile 第三步:生成Docker預設文件 把預設代碼修改 第四步:修改Dockerfile文件屬性(如果不修改則會導致發佈的時候Docker文件沒有一 ...
  • 項目使用ABP框架,最近有需求數據量會持續變大,需要分表存儲。 發現ShardinfCore可以快速實現EF分表操作,並且作者@薛家明還特別為ABP集成寫了教程,完美的選擇。 ShardinfCore作者教程很齊全,這次以ABP 8.*的用戶視角進行集成記錄,希望幫到需要的人。 開發環境: ABP ...
  • IoTClient 是一個針對物聯網 (IoT) 領域的開源客戶端庫,它主要用於實現與各種工業設備之間的通信。這個庫是用 C# 編寫的,並且基於 .NET Standard 2.0,這意味著可以用於多個版本的.NET,包括 .NET Framework、.NET Core、.NET 5 及以上版本,... ...
  • WPFUI報錯 page does not have a parameterless constructor. If you are using Wpf.Ui.IPageService do not navigate initially and don't use Cache or Precache ...
  • 邁信達音視頻字幕軟體(MaixindaSubtitle)是一款專註於自動化視頻轉錄文本、字幕製作、字幕翻譯的AI自動化字幕軟體。通過AI一鍵生成本地音頻與視頻的字幕文件,及翻譯字幕內容。使用AI提取音視頻對話內容後翻譯、生成字幕文件,可以低成本並高效地將任意語言的視頻、音頻轉錄並翻譯為目標語言,適用 ...
  • 前言 在Web應用項目中許可權認證是個繞不開的話題,傳統方法複雜又耗時。MiniAuth推出專為.NET開發者設計的簡單、實用的許可權認證項目。 MiniAuth,作為ASP.NET Core的插件,讓我們快速輕鬆實現用戶登錄、許可權檢查等功能。它支持多種認證方式,如JWT、Cookie,且易於集成到現有 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...