国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux之套接字UDP實(shí)現(xiàn)網(wǎng)絡(luò)通信

這篇具有很好參考價值的文章主要介紹了Linux之套接字UDP實(shí)現(xiàn)網(wǎng)絡(luò)通信。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Linux之套接字UDP實(shí)現(xiàn)網(wǎng)絡(luò)通信

1.引言

? 套接字(Socket)是計(jì)算機(jī)網(wǎng)絡(luò)中實(shí)現(xiàn)網(wǎng)絡(luò)通信的一種編程接口。它提供了應(yīng)用程序與網(wǎng)絡(luò)通信之間的一座橋梁,因?yàn)樗试S應(yīng)用程序通過網(wǎng)絡(luò)發(fā)送和接收相應(yīng)的數(shù)據(jù)以實(shí)現(xiàn)不同主機(jī)之間的通信。

? Linux之套接字UDP實(shí)現(xiàn)網(wǎng)絡(luò)通信,Linux,linux,udp,運(yùn)維

通常套接字由以下兩部分組成:

1.網(wǎng)絡(luò)IP和端口號:IP用來標(biāo)識主機(jī),而端口號可以標(biāo)識到單臺主機(jī)的唯一進(jìn)程。

2.通信協(xié)議:套接字通過規(guī)定通信協(xié)議來制定數(shù)據(jù)傳輸和發(fā)送的規(guī)則。常見的有TCP和UDP等協(xié)議。

TCP是一種面向連接的協(xié)議,提供可靠的、有序的、基于字節(jié)流的數(shù)據(jù)傳輸。

UDP是一種無連接的協(xié)議,提供不可靠的、無序的、基于數(shù)據(jù)報(bào)的數(shù)據(jù)傳輸。

? 我們今天要實(shí)現(xiàn)的是通過UDP協(xié)議實(shí)現(xiàn)網(wǎng)絡(luò)通信。UDP協(xié)議通信雖然無連接不可靠,可是足夠簡單到我們了解通信的基本原理。

那么話不多講,我們趕快看看我們學(xué)習(xí)完今天這一篇能夠?qū)崿F(xiàn)出怎么樣的結(jié)果吧:

Linux之套接字UDP實(shí)現(xiàn)網(wǎng)絡(luò)通信,Linux,linux,udp,運(yùn)維

我們通過實(shí)現(xiàn)客戶端和服務(wù)器端,實(shí)現(xiàn)了通過套接字UDP創(chuàng)建了一個服務(wù)器,之后通過客戶端鏈接并且通信的一個功能。

事不宜遲,我們馬上實(shí)現(xiàn)!

2.具體實(shí)現(xiàn)

? 首先我們需要明確具體的大思路: 先服務(wù)器端創(chuàng)建socket套接字,并recvfrom接收到??蛻舳艘矂?chuàng)建套接字綁定后確定到唯一IP和端口號之后即可進(jìn)行通信。

? 在具體實(shí)現(xiàn)之前我們首先需要一些必要的套接字接口

2.1需要知道的套接字接口

1.socket()

? socket函數(shù)是用于創(chuàng)建套接字的函數(shù),創(chuàng)建成功返回文件描述符fd,失敗返回-1;

int socket(int domain, int type, int protocol);

? 參數(shù)說明:

  • domain

    :指定套接字的地址族(Address Family)

    今天我們選擇:

    • AF_INET:IPv4 地址族
  • type

    :指定套接字的類型(Socket Type)

    今天我們選擇:

    • SOCK_DGRAM:無連接的數(shù)據(jù)報(bào)套接字,用于 UDP 協(xié)議
  • protocol

    :可選參數(shù),指定具體的傳輸協(xié)議。常用的有:

    ? 今天我們選擇:

    • 0:自動選擇合適的協(xié)議

2.bind()

? 在Linux下,bind() 函數(shù)用于將一個套接字(socket)與特定的IP地址和端口號進(jìn)行綁定。

*int bind(int sockfd, const struct sockaddr addr,socklen_t addrlen);

參數(shù)說明:

  • sockfd:要進(jìn)行綁定的套接字的文件描述符。
  • addr:指向一個 struct sockaddr 結(jié)構(gòu)體的指針,其中包含要綁定的IP地址和端口號信息。
  • addrlenaddr 結(jié)構(gòu)體的長度。

在綁定bind的第二個參數(shù)中,我們也需要用到庫中定義好的sockaddr_in結(jié)構(gòu)體來初始化!

具體結(jié)構(gòu)體struct sockaddr_in說明:

結(jié)構(gòu)體中有三個值也需要初始化指定一下:

  1. sin_family:表示地址族(Address Family),一般為 AF_INET

  2. sin_port:表示端口號。它是一個 16 位的整數(shù),使用網(wǎng)絡(luò)字節(jié)序(大端字節(jié)序)表示。在使用時,通常需要使用 htons() 函數(shù)將主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序。

  3. sin_addr:表示 IPv4 地址。它是一個 struct in_addr 類型的結(jié)構(gòu)體,用于存儲 32 位的 IPv4 地址。

    一般服務(wù)端用INADDR_ANY,讓udp_server在啟動時候可以綁定任何ip.

    ? 客戶端用inet_addr函數(shù)將字符串轉(zhuǎn)化成32位無符號整數(shù)

3.recvfrom()

從套接字接收數(shù)據(jù),并獲取發(fā)送方的地址

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

參數(shù)說明:

  • sockfd:接收數(shù)據(jù)的套接字的文件描述符。
  • buf:指向接收數(shù)據(jù)的緩沖區(qū)。
  • len:緩沖區(qū)的長度。
  • flags:可選的標(biāo)志參數(shù),用于影響接收操作的行為,通常設(shè)為 0。
  • src_addr:用于存儲發(fā)送方的地址信息(對于面向數(shù)據(jù)報(bào)的套接字)。它是一個 struct sockaddr 結(jié)構(gòu)體的指針。
  • addrlensrc_addr 結(jié)構(gòu)體的長度,作為輸入?yún)?shù)指定 src_addr 緩沖區(qū)的大小,作為輸出參數(shù)返回實(shí)際地址的長度。

4.sendto()

通過套接字發(fā)送數(shù)據(jù)到指定目的地

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);

參數(shù)說明:

  • sockfd:要發(fā)送數(shù)據(jù)的套接字的文件描述符。
  • buf:指向要發(fā)送數(shù)據(jù)的緩沖區(qū)。
  • len:要發(fā)送數(shù)據(jù)的長度。
  • flags:可選的標(biāo)志參數(shù),用于影響發(fā)送操作的行為,通常設(shè)為 0。
  • dest_addr:指向目標(biāo)地址(接收方地址)的結(jié)構(gòu)體指針,可以是 struct sockaddr 或其派生類型的指針。
  • addrlendest_addr 結(jié)構(gòu)體的長度。

2.2服務(wù)器端server.hpp

? 在服務(wù)器的頭文件中,我們首先需要定義一個udpserver的類,服務(wù)器類中需要有服務(wù)器的初始化與啟動命令,當(dāng)然需要有構(gòu)造析構(gòu)等。默認(rèn)的私有成員是**_sock套接字和port端口**


const static uint16_t default_port = 8080;

class UdpServer
{
   public:
    UdpServer(uint16_t port = default_port)
    :_port(port)
    {
        std::cout<< "server addr: "<<_port <<std::endl;
    }

    ~UdpServer() {}

    void InitServer() //初始化服務(wù)器
    {
        _sock = socket(AF_INET,SOCK_DGRAM,0);
        if(_sock < 0)
        {
            std::cerr << " socket create err " << std::endl;
        }
        std::cout << "create socket success: " << _sock << std::endl;

        struct sockaddr_in local; //利用庫中創(chuàng)建好的結(jié)構(gòu)體來初始化socket
        memset(&local,0,sizeof(local));
        local.sin_family = AF_INET;
        local.sin_port = htons(_port); // 本地主機(jī)序列轉(zhuǎn)網(wǎng)絡(luò)序列
        local.sin_addr.s_addr = INADDR_ANY; //讓udp_server在啟動時候可以綁定任何ip

         //綁定
        if(bind(_sock,(struct sockaddr*)&local,sizeof(local)) < 0)
        {
            std::cerr << " bind error" << std::endl;
            exit(-1);
        }
        std::cout << "bind socket success: " << _sock << std::endl;
    }   
        void Start()    //執(zhí)行邏輯
        {
            char buffer[1024];
            while(true)
            {   //接收數(shù)據(jù)
                //ssize_t recvfrom(套接字,緩沖區(qū),緩沖區(qū)大小,flag = 0,client的IP和port,實(shí)際結(jié)構(gòu)體大小);
                struct sockaddr_in far; //遠(yuǎn)端定義結(jié)構(gòu)體
                socklen_t len = sizeof(far); 
                int n = recvfrom(_sock,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&far,&len);
                if(n > 0) buffer[n] = '\0';
                else continue;
                
                std::string clientip = inet_ntoa(far.sin_addr); //ipv4的地址從二進(jìn)制轉(zhuǎn)化為點(diǎn)分十進(jìn)制的函數(shù)
                uint16_t clientport = ntohs(far.sin_port);      //將網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)化為一個本地主機(jī)字節(jié)序
                std::cout<< clientip << "-" << clientport << "#" << buffer << std::endl;

                //發(fā)送數(shù)據(jù)
                //ssize_t sendto(套接字,發(fā)的數(shù)據(jù),數(shù)據(jù)大小,flag = 0,(struct sockaddr*)&far,sizeof(far));
                sendto(_sock,buffer,sizeof(buffer),0,(struct sockaddr*)&far,sizeof(far));

                
            }

        }


    

   private:

    int _sock; //套接字
    uint16_t _port; //端口

};

2.3服務(wù)器端server.cc

在服務(wù)器端的使用中,我們采用智能指針unique_ptr來幫助資源創(chuàng)建以及銷毀,在使用中,我們調(diào)用以上server.hpp中類的初始化與啟動函數(shù)即可.

//輸出格式說明:./udp_server port

static void usage(string proc)//使用手冊
{
    std::cout << "Usage:\n\t" << proc << "port\n" <<std::endl;


}

int main(int argc,char* argv[]) //獲取到參數(shù)

{
    if(argc != 2) //若輸入?yún)?shù)不是兩個的話,就彈出使用手冊 
    {
        usage(argv[0]);
        exit(-1);
    }
    uint16_t port = atoi(argv[1]); //獲取到端口直接進(jìn)行構(gòu)造后面

    std::unique_ptr<UdpServer> ptr(new UdpServer(port));

    ptr->InitServer();
    ptr->Start();
    return 0;
}

2.4客戶端Client.cc

在客戶端中我們首先需要知道主函數(shù)的服務(wù)端的ip和端口,也就是我們需要從輸入的參數(shù)來知道服務(wù)端是誰?之后由用戶輸入消息后發(fā)送給服務(wù)器端并輸出。


// 執(zhí)行格式:./udp_client ip serverport
static void usage(std::string proc) //使用手冊
    {
    std::cout << "Usage:\n\t" << proc << "port\n" <<std::endl;
    }
int main(int argc,char* argv[])
{

    if(argc != 3)		//如果輸入?yún)?shù)個數(shù)不是3個就彈出使用手冊
    {
        usage(argv[0]);
        exit(-1);
    }

    //從主函數(shù)獲取到了服務(wù)端的ip和端口
    std::string serverip = argv[1];
    uint16_t serverport = atoi(argv[2]);


    
    int sock = socket(AF_INET,SOCK_DGRAM,0);  //創(chuàng)建套接字
    if(sock < 0)
    {
        std::cerr << "create socket errno" <<std::endl;
        exit(-1);
    }

    //明確server是誰
    struct sockaddr_in server;
    memset(&server,0,sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(serverport);
    server.sin_addr.s_addr = inet_addr(serverip.c_str());
    //這里client一定需要綁定bind 不過由os來幫我們做,因?yàn)镺S需要隨機(jī)分配端口,防止沖突
   //用戶輸入
    while(true)
    {
        std::string message;
        std::cout<< "please Enter#  ";
        std::cin >> message;

        sendto(sock,message.c_str(),message.size(),0,(struct sockaddr*)&server,sizeof(server));

        //接收消息
        char buffer[1024];
        struct sockaddr_in temp;
        socklen_t len = sizeof(temp); 
        int n = recvfrom(sock,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&temp,&len);
        if(n > 0)
        {
            buffer[n] = 0;
            std::cout << "server echo#  " << buffer << std::endl; 
        }
    }
    
    return 0;
}

最后執(zhí)行后我們便可以看出結(jié)果: 說明執(zhí)行成功!

Linux之套接字UDP實(shí)現(xiàn)網(wǎng)絡(luò)通信,Linux,linux,udp,運(yùn)維文章來源地址http://www.zghlxwxcb.cn/news/detail-670218.html

到了這里,關(guān)于Linux之套接字UDP實(shí)現(xiàn)網(wǎng)絡(luò)通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Linux網(wǎng)絡(luò)】網(wǎng)絡(luò)編程套接字 -- 基于socket實(shí)現(xiàn)一個簡單UDP網(wǎng)絡(luò)程序

    【Linux網(wǎng)絡(luò)】網(wǎng)絡(luò)編程套接字 -- 基于socket實(shí)現(xiàn)一個簡單UDP網(wǎng)絡(luò)程序

    我們把數(shù)據(jù)從A主機(jī)發(fā)送到B主機(jī),是目的嗎?不是,真正通信的不是這兩個機(jī)器!其實(shí)是這兩臺機(jī)器上面的軟件(人) 數(shù)據(jù)有 IP(公網(wǎng)) 標(biāo)識一臺唯一的主機(jī) ,用誰來標(biāo)識各自主機(jī)上客戶或者服務(wù)進(jìn)程的唯一性呢? 為了更好的表示一臺主機(jī)上服務(wù)進(jìn)程的唯一性,我們采用 端口號

    2024年02月12日
    瀏覽(848)
  • 【探索Linux】P.28(網(wǎng)絡(luò)編程套接字 —— 簡單的UDP網(wǎng)絡(luò)程序模擬實(shí)現(xiàn))

    【探索Linux】P.28(網(wǎng)絡(luò)編程套接字 —— 簡單的UDP網(wǎng)絡(luò)程序模擬實(shí)現(xiàn))

    在前一篇文章中,我們詳細(xì)介紹了UDP協(xié)議和TCP協(xié)議的特點(diǎn)以及它們之間的異同點(diǎn)。 本文將延續(xù)上文內(nèi)容,重點(diǎn)討論簡單的UDP網(wǎng)絡(luò)程序模擬實(shí)現(xiàn) 。通過本文的學(xué)習(xí),讀者將能夠深入了解UDP協(xié)議的實(shí)際應(yīng)用,并掌握如何編寫簡單的UDP網(wǎng)絡(luò)程序。讓我們一起深入探討UDP網(wǎng)絡(luò)程序的

    2024年04月08日
    瀏覽(584)
  • C++網(wǎng)絡(luò)編程 TCP套接字基礎(chǔ)知識,利用TCP套接字實(shí)現(xiàn)客戶端-服務(wù)端通信

    C++網(wǎng)絡(luò)編程 TCP套接字基礎(chǔ)知識,利用TCP套接字實(shí)現(xiàn)客戶端-服務(wù)端通信

    流式套接字編程針對TCP協(xié)議通信,即是面向?qū)ο蟮耐ㄐ?,分為服?wù)端和客戶端兩部分。 1)加載套接字庫( 使用函數(shù)WSAStartup() ),創(chuàng)建套接字( 使用socket() ) 2)綁定套接字到一個IP地址和一個端口上( 使用函數(shù)bind() ) 3)將套接字設(shè)置為監(jiān)聽模式等待連接請求( 使用函數(shù)

    2024年02月03日
    瀏覽(103)
  • 【Linux】網(wǎng)絡(luò)基礎(chǔ)+UDP網(wǎng)絡(luò)套接字編程

    【Linux】網(wǎng)絡(luò)基礎(chǔ)+UDP網(wǎng)絡(luò)套接字編程

    只做自己喜歡做的事情,不被社會和時代裹挾著前進(jìn),是一件很奢侈的事。 1. 首先計(jì)算機(jī)是人類設(shè)計(jì)出來提高生產(chǎn)力的工具,而人類的文明綿延至今一定離不開人類之間互相的協(xié)作,既然人類需要協(xié)作以完成更為復(fù)雜的工作和難題,所以計(jì)算機(jī)作為人類的工具自然也一定需要

    2024年02月08日
    瀏覽(89)
  • 「網(wǎng)絡(luò)編程」第二講:網(wǎng)絡(luò)編程socket套接字(三)_ 簡單TCP網(wǎng)絡(luò)通信程序的實(shí)現(xiàn)

    「網(wǎng)絡(luò)編程」第二講:網(wǎng)絡(luò)編程socket套接字(三)_ 簡單TCP網(wǎng)絡(luò)通信程序的實(shí)現(xiàn)

    「前言」文章是關(guān)于網(wǎng)絡(luò)編程的socket套接字方面的,上一篇是網(wǎng)絡(luò)編程socket套接字(二),下面開始講解!? 「歸屬專欄」網(wǎng)絡(luò)編程 「主頁鏈接」個人主頁 「筆者」楓葉先生(fy) 「楓葉先生有點(diǎn)文青病」「每篇一句」 I?do?not?know?where?to?go,but?I?have?been?on?the?road. 我不知

    2024年02月11日
    瀏覽(29)
  • 【Linux網(wǎng)絡(luò)】網(wǎng)絡(luò)編程套接字(預(yù)備知識+UDP)

    【Linux網(wǎng)絡(luò)】網(wǎng)絡(luò)編程套接字(預(yù)備知識+UDP)

    目錄 預(yù)備知識 1. 理解源IP地址和目的IP地址 2. 理解源MAC地址和目的MAC地址 3. 認(rèn)識端口號 ?4. 理解源端口號和目的端口號 5. 端口號(port) vs 進(jìn)程pid 6. 認(rèn)識TCP協(xié)議和認(rèn)識UDP協(xié)議 7. 網(wǎng)絡(luò)字節(jié)序 socket編程接口? 1. socket 常見API 2. sockaddr結(jié)構(gòu)? 簡單的UDP網(wǎng)絡(luò)程序? 1. 服務(wù)端創(chuàng)建udp

    2024年02月19日
    瀏覽(93)
  • 【Linux Network】網(wǎng)絡(luò)編程套接字(代碼練習(xí))—UDP

    【Linux Network】網(wǎng)絡(luò)編程套接字(代碼練習(xí))—UDP

    目錄 1. 常用接口 2. C/S 回聲模擬 3. C/S myshell 的制作 ?Linux網(wǎng)絡(luò)編程? 1. 常用接口 socket:創(chuàng)建套接字: 返回值: 套接字創(chuàng)建成功返回一個文件描述符 ,創(chuàng)建失敗返回-1,同時錯誤碼會被設(shè)置。 參數(shù): domain: 網(wǎng)絡(luò)通信 設(shè)置為 AF_INET(IPv4)或AF_INET6(IPv6) ; type:基于 UDP的網(wǎng)

    2024年02月03日
    瀏覽(234)
  • 【網(wǎng)絡(luò)通信】socket編程——TCP套接字

    【網(wǎng)絡(luò)通信】socket編程——TCP套接字

    TCP依舊使用代碼來熟悉對應(yīng)的套接字,很多接口都是在udp中使用過的 所以就不會單獨(dú)把他們拿出來作為標(biāo)題了,只會把第一次出現(xiàn)的接口作為標(biāo)題 通過TCP的套接字 ,來把數(shù)據(jù)交付給對方的應(yīng)用層,完成雙方進(jìn)程的通信 在 tcpServer.hpp 中,創(chuàng)建一個命名空間 yzq 用于封裝 在命名

    2024年02月13日
    瀏覽(102)
  • 網(wǎng)絡(luò)編程套接字(二)之UDP服務(wù)器簡單實(shí)現(xiàn)

    網(wǎng)絡(luò)編程套接字(二)之UDP服務(wù)器簡單實(shí)現(xiàn)

    目錄 一、服務(wù)端UdpServer 1、udp_server.hpp 1、服務(wù)器的初始化 2、服務(wù)器的運(yùn)行 2、udp_server.cc 二、客戶端UdpClient udp_client.cc 三、完整代碼 首先,我們在該文件中,將服務(wù)器封裝成一個類,而作為一款服務(wù)器,必須要有自己的端口號,同時網(wǎng)絡(luò)服務(wù)器需要有對應(yīng)的IP地址,文件描述

    2024年04月16日
    瀏覽(20)
  • linux_網(wǎng)絡(luò)通信-套接字通信socket-網(wǎng)絡(luò)字節(jié)序-IP地址轉(zhuǎn)換函數(shù)-inet_pton函數(shù)-htonl函數(shù)-htons函數(shù)-ntohl函數(shù)-ntohs函數(shù)

    linux_網(wǎng)絡(luò)通信-套接字通信socket-網(wǎng)絡(luò)字節(jié)序-IP地址轉(zhuǎn)換函數(shù)-inet_pton函數(shù)-htonl函數(shù)-htons函數(shù)-ntohl函數(shù)-ntohs函數(shù)

    接上一篇:linux_進(jìn)程鎖與文件鎖-pthread_mutexattr_init函數(shù)-pthread_mutexattr_setpshared函數(shù) ??今天開始分享網(wǎng)絡(luò)通信了,主要是就是socket套接字通信,本篇先分享一些預(yù)備知識,有網(wǎng)絡(luò)字節(jié)序以及一些IP地址轉(zhuǎn)換函數(shù),話不多說,開始上菜: 此博主在CSDN發(fā)布的文章目錄:我的CSDN目錄

    2024年02月03日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包