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 <stdi ...


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
更多相關文章
  • 我前面幾篇隨筆介紹了關於幾篇關於SqlSugar的基礎封裝,已經可以直接應用在Winform項目開發上,並且基礎介面也通過了單元測試,同時測試通過了一些Winform功能頁面;本篇隨筆繼續深化應用開發,著手在在.net6框架的Web API上開發應用,也就是基於.net core的Web API應用... ...
  • 前言 一個項目上線了兩個月,除了一些反饋的優化和小Bug之外,項目一切順利;前期是屬於推廣階段,可能使用人員沒那麼多,當然對於項目部署肯定提前想到併發量了,所以早就把集群安排上,而且還在測試環境搞了一下壓測,絕對是沒得問題的;但是,就在兩個月後的一天,系統突然跑的比烏龜還慢,投訴開始就陸續反饋過來了 ...
  • 本文以C#及vb.net代碼為例介紹如何來實現合併PDF頁面內容。本文中的合併並非將兩個文檔簡單合併為一個文檔,而是將多個頁面內容合併到一個頁面,目的是減少頁面上的空白區域,使頁面佈局更為緊湊、合理。下麵,將分別從兩個示例來展示合併,即: 從兩個PDF文檔頁面實現頁面合併 在同一個PDF文檔實現頁面 ...
  • 由於我們有時候需要在基於.net framework的項目上使用(如Winform端應用),有時候有需要在.net core的項目上使用(如.net core的WebAPI),那麼我們把基於SQLSugar的基礎模塊封裝,編譯為.net standard就很有必要,而且由於.net framewor... ...
  • 一 什麼是介面 介面是指定一組函數成員而不實現它們的引用類型。 class Program { static void FlyFunc(IFly obj) { obj.Fly(); } static void Main(string[] args) { var bird = new Bird(); ...
  • 最近使用STM32CubeIDE來進行編程,現對其軟體架構及功能進行學習和總結,也希望後來的小伙伴能夠更快的上手這款軟體! STM32CubeIDE官方介紹 STM32CubeIDE(Integrated development environment for STM32 products) 特征: ...
  • CentOS7 根分區擴容 [詳細過程] 前提 1.如果原來的系統根分區為邏輯捲分區 則可以使用如下的方法 如果不是則不可以 2.如果原來的系統根分區不是邏輯捲分區 則不可以擴展只能再添加掛在磁碟進行相應目錄的擴容 添加磁碟 [此處添加一塊2G的硬碟] 1.先添加一塊磁碟 然後在系統中查看是否可以正 ...
  • STM8S103F3 產品手冊, 接線 ST-LINK和開發板的SWIM口是一一對應的, 直接連到開發板的同名PIN, 開發工具庫 SPL 第三方維護的 STM8S103F3_SPL 創建項目 打開 STVD 工具鏈: 選擇STM8 Cosmic, 指定toolchains到對應的目錄, 選擇晶元型... ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...