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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...