Linux網路編程示例

来源:https://www.cnblogs.com/lazyfiish/archive/2022/04/30/16209269.html
-Advertisement-
Play Games

linux網路編程示例 簡單TCP、UDP編程示例。 TCP TCP客戶端與伺服器通信模型 伺服器代碼 #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #include ...


linux網路編程示例

簡單TCP、UDP編程示例。

TCP

  • TCP客戶端與伺服器通信模型

image

  • 伺服器代碼
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
    const char ip[] = "127.0.0.1";
    const int port = 9006;

    //創建socket,使用IP協議(PF_INET)+TCP協議(SOCK_STREAM)
    int fd_listen = socket(PF_INET, SOCK_STREAM, 0);

    //綁定固定ip:port地址
    in_addr_t ip_num = inet_addr(ip);
    sockaddr_in addr_server = {AF_INET, port, ip_num};
    bind(fd_listen, (sockaddr *)&addr_server, sizeof(addr_server));

    //監聽socket
    listen(fd_listen, 10);

    //接受客戶端連接,並返回連接socket
    sockaddr_in addr_client;
    socklen_t len_client_addr = sizeof(addr_client);
    int fd_conn = accept(fd_listen, (sockaddr *)&addr_client, &len_client_addr);

    //接收客戶端數據
    printf("start receiving data...\n");

    char buf[4096];
    while (true)
    {
        memset(buf, '\0', sizeof(buf));
        int ret = recv(fd_conn, buf, sizeof(buf) - 1, 0);

        // recv返回0,表示客戶端斷開連接
        if (ret == 0)
        {
            printf("connection closed\n");
            break;
        }

        //列印接收的數據
        printf("%s", buf);
    }

    //關閉socket
    close(fd_conn);
    close(fd_listen);
    return 0;
}
  • 客戶端代碼
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
    const char ip[] = "127.0.0.1"; //伺服器ip
    const int port = 9006;         //伺服器port

    //創建socket,使用IP協議(PF_INET)+TCP協議(SOCK_STREAM)
    int fd_conn = socket(PF_INET, SOCK_STREAM, 0);

    //連接伺服器
    in_addr_t ip_num = inet_addr(ip);
    sockaddr_in addr_server = {AF_INET, port, ip_num}; //伺服器地址
    connect(fd_conn, (sockaddr *)&addr_server, sizeof(addr_server));

    const char message[] = "hello world!\n";
    for (int i = 0; i < 10; i++)
    {
        send(fd_conn, message, strlen(message), 0);
        sleep(1);
    }

    //關閉socket
    close(fd_conn);
    return 0;
};

UDP

  • UDP客戶端與伺服器通信模型

image

  • 伺服器代碼
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
    const char ip[] = "127.0.0.1";
    const int port = 9006;

    //創建socket,使用IP協議(PF_INET)+SOCK_DGRAM
    int fd_socket = socket(PF_INET, SOCK_DGRAM, 0);

    //綁定固定ip:port地址
    in_addr_t ip_num = inet_addr(ip);
    sockaddr_in addr_server = {AF_INET, port, ip_num};
    bind(fd_socket, (sockaddr *)&addr_server, sizeof(addr_server));

    //接收客戶端數據
    printf("start receiving data...\n");

    //存放客戶端地址
    sockaddr_in addr_client;
    socklen_t len_addr_client = sizeof(addr_client);

    char buf[4096];
    while (true)
    {
        //接收數據
        memset(buf, '\0', sizeof(buf));
        int ret = recvfrom(fd_socket, buf, sizeof(buf) - 1, 0, (sockaddr *)&addr_client, &len_addr_client);
        char *ip_client = inet_ntoa(addr_client.sin_addr);
        int port_client = addr_client.sin_port;

        //列印接收的數據
        printf("recived from %s:%d: %s\n", ip_client, port_client, buf);
    }

    //關閉socket
    close(fd_socket);
    return 0;
}
  • 客戶端代碼
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
    const char ip[] = "127.0.0.1";
    const int port = 9006;

    //創建socket,使用IP協議(PF_INET)+SOCK_DGRAM
    int fd_socket = socket(PF_INET, SOCK_DGRAM, 0);

    //綁定固定ip:port地址
    in_addr_t ip_num = inet_addr(ip);
    sockaddr_in addr_server = {AF_INET, port, ip_num};
    bind(fd_socket, (sockaddr *)&addr_server, sizeof(addr_server));

    //接收客戶端數據
    printf("start receiving data...\n");

    //存放客戶端地址
    sockaddr_in addr_client;
    socklen_t len_addr_client = sizeof(addr_client);

    char buf[4096];
    while (true)
    {
        //接收數據
        memset(buf, '\0', sizeof(buf));
        int ret = recvfrom(fd_socket, buf, sizeof(buf) - 1, 0, (sockaddr *)&addr_client, &len_addr_client);
        char *ip_client = inet_ntoa(addr_client.sin_addr);
        int port_client = addr_client.sin_port;

        //列印接收的數據
        printf("recived from %s:%d: %s\n", ip_client, port_client, buf);
    }

    //關閉socket
    close(fd_socket);
    return 0;
}

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

-Advertisement-
Play Games
更多相關文章
  • 餅圖常用於統計學模塊,畫餅圖用到的方法為:pie( ) 一、pie()函數用來繪製餅圖 pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance= ...
  • 目前【騰訊雲簡訊】為客戶提供【國內簡訊】、【國內語音】和【海外簡訊】三大服務,騰訊雲簡訊SDK支持以下操作: 國內簡訊 國內簡訊支持操作: • 指定模板單發簡訊 • 指定模板群發簡訊 • 拉取簡訊回執和簡訊回覆狀態 海外簡訊 海外簡訊支持操作: • 指定模板單發簡訊 • 指定模板群發簡訊 • 拉取短 ...
  • 前言 最近在學習java,遇到了一個經典列印題目,空心金字塔,初學者記錄,根據網上教程,有一句話感覺很好,就是先把麻煩的問題轉換成很多的簡單問題,最後一一解決就可以了,然後先死後活,先把程式寫死,後面在改成活的。 如下圖是空心金字塔最終的實現效果,先要求用戶輸入層數然後輸出 一.普通矩形 首先我們先 ...
  • 近日,New Relic發佈了最新的2022 Java生態系統報告,這份報告可以幫助我們深入的瞭解Java體系的最新使用情況,下麵就一起來看看2022年,Java發展的怎麼樣了,還是Java 8 YYDS嗎? Java 11成為新的標準 在2020年的時候,Java 11已經推出了1年多,但當時Ja ...
  • 框架,本質上是一些實用經驗集合。即是前輩們在實際開發過程中積攢下來的實戰經驗,累積成一套實用工具,避免你在開發過程中重覆去造輪子,特別是幫你把日常中能遇到的場景或問題都給屏蔽掉,框架的意義在於屏蔽掉開發的基礎複雜度、屏蔽掉此類共性的東西,同時建立嚴格的編碼規範,讓框架使用者開箱即用,並且只需要關註差... ...
  • 前言 又到了每日分享Python小技巧的時候了,今天給大家分享的是Python中兩種常見的數據類型合併方法。好奇知道是啥嗎?就不告 訴你,想知道就往下看呀。話不多說,直接上… 1 合併字典 在某些場景下,我們需要對兩個(多個)字典進行合併。例如需要將如下兩個字典進行合併: 1 dict1 = {"a ...
  • # Spring概述 1、Spring是輕量級開源JavaEE框架 2、Spring可以解決企業應用開發的複雜性 3、組成核心IOC、Aop IOC:控制反轉,把創建對象過程交給Spring進行管理 Aop:面向切麵,不修改源代碼進行功能增強 4、Spring特點 方便解耦,簡化開發 Aop編程支持 ...
  • 有朋友好奇為什麼將 閉包 歸於語法糖,這裡簡單聲明下,C# 中的所有閉包最終都會歸結於 類 和 方法,為什麼這麼說,因為 C# 的基因就已經決定了,如果大家瞭解 CLR 的話應該知道, C#中的類最終都會用 MethodTable 來承載,方法都會用 MethodDesc 來承載, 所以不管你怎麼玩 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...