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

網絡編程套接字應用分享【Linux &C/C++ 】【UDP應用 | TCP應用 | TCP&線程池小項目】

這篇具有很好參考價值的文章主要介紹了網絡編程套接字應用分享【Linux &C/C++ 】【UDP應用 | TCP應用 | TCP&線程池小項目】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

前提知識

1. 理解源ip,目的ip和Macip

2. 端口號

3. 初識TCP,UDP協(xié)議

4.?網絡字節(jié)序

5. socket 編程

sockaddr類型?

一,基于udp協(xié)議編程?

1. socket——創(chuàng)建套接字

2. bind——將套接字強綁定?

3. recvfrom——接受數(shù)據

4. sendto——發(fā)出信息

?遇到的問題

(1. 云服務器中以及無法分配IP問題

(2. IP:127.0.0.1更深層次的認識

(3. 關于服務端bind的優(yōu)化

源碼

二,基于tcp協(xié)議編程

1. listen——服務端監(jiān)聽

2. accept——服務端接收

3. connect——客戶端請求

4. send & recev

三,服務端與客戶端通信小項目

結構圖一覽

源碼?

1. 單進程處理

2.?子進程處理

2.1.?孫子進程處理

3. 多線程處理

4. 線程池處理

下期:TCP協(xié)議原理

結語


嗨!收到一張超美的風景圖,愿你每天都能順心!?

linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

前提知識

1. 理解源ip,目的ip和Macip

數(shù)據在以太網上傳輸,經過多個路由器,Mac地址多次封裝解包是變化的(可以理解為數(shù)據的下一個主機地址),而源ip,尤其是目的ip一般是不會改變。

2. 端口號

端口號 (port) 是傳輸層協(xié)議的內容:
  • 端口號是一個2字節(jié)16位的整數(shù)(uint16_t);
  • 端口號用來標識一個進程, 告訴操作系統(tǒng), 當前的這個數(shù)據要交給哪一個進程來處理;
  • 一個端口號只能被一個進程占用(標識一臺主機進程的唯一性

理解:假設客戶發(fā)送操作在終端應用為A,在另一臺機器的服務器應用為B,A向B發(fā)送操作請求,本質上是不同機器之間進程間通信,請求數(shù)據經過封裝,傳遞,解包后,B所在的操作系統(tǒng)將數(shù)據根據端口號,交給那個進程處理。

同理,我們就能理解源端口號,就是發(fā)出數(shù)據的進程;目的端口號,處理數(shù)據的進程 。

因此,IP地址 + 端口號能夠標識網絡上的唯一臺主機的唯一一個進程;

注意:

1.一個進程可以有多個端口號綁定,但一個端口不能被多個進程綁定。

2. pid是系統(tǒng)管理進程的唯一標識符,與端口號沒有聯(lián)系。

同時,{IP地址 + 端口號}的模式被叫做套接字,網絡通信用套接字的方法實現(xiàn),網絡編程,也可以被叫做套接字編程

3. 初識TCP,UDP協(xié)議

首先我們來找找他們傳輸層上的這兩協(xié)議

?linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

這里我們只了解兩協(xié)議的特點,具體我們后面再結合場景理解?

各自特點:

TCP(Transmission Control Protocol 傳輸控制協(xié)議)

  • 傳輸層協(xié)議
  • 有連接(是否需要手動連接)——神似打電話
  • 可靠傳輸(對數(shù)據包檢測,丟包重傳等等)
  • 面向字節(jié)流(后面再提)

UDP(User Datagram Protocol 用戶數(shù)據報協(xié)議)

  • 傳輸層協(xié)議
  • 無連接(不用連接就可以發(fā)送)——神似發(fā)郵件
  • 不可靠傳輸(不關心是否丟包)
  • 面向數(shù)據報(后面再說)

4.?網絡字節(jié)序

說到字節(jié)序,我們是否想到C語言中學過的大小端字節(jié)序,那個是數(shù)據在內存中的存儲方式。(大小端可參見:整型,浮點型深刻理解【C語言】【整型 || 原,反,補碼 || 浮點型 || 大小端字節(jié)序】_小端浮點數(shù)-CSDN博客)

現(xiàn)在我們討論的則是數(shù)據在向網絡發(fā)送時,是從低字節(jié)向高地址發(fā)送(小端),還是從高字節(jié)向高地址發(fā)送(大端)。

磁盤文件中的多字節(jié)數(shù)據相對于文件中的偏移地址也有大端小端之分, 網絡數(shù)據流同樣有大端小端之分 . 那么如何 定義網絡數(shù)據流的地址 ?
  • 發(fā)送主機通常將發(fā)送緩沖區(qū)中的數(shù)據按內存地址從低到高的順序發(fā)出;
  • 接收主機把從網絡上接到的字節(jié)依次保存在接收緩沖區(qū)中,也是按內存地址從低到高的順序保存;
  • 因此,網絡數(shù)據流的地址應這樣規(guī)定:先發(fā)出的數(shù)據是低地址,后發(fā)出的數(shù)據是高地址.
  • TCP/IP協(xié)議規(guī)定,網絡數(shù)據流應采用大端字節(jié)序,即低地址高字節(jié).
  • 不管這臺主機是大端機還是小端機, 都會按照這個TCP/IP規(guī)定的網絡字節(jié)序來發(fā)送/接收數(shù)據;
  • 如果當前發(fā)送主機是小端, 就需要先將數(shù)據轉成大端; 否則就忽略, 直接發(fā)送即可
為使網絡程序具有可移植性 , 使同樣的C代碼在大端和小端計算機上編譯后都能正常運行,可以調用以下庫函數(shù)做網絡字節(jié)序和主機字節(jié)序的轉換:
linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp
(注:h是host 主機;n是network;l是32位下long(4byte);s是16位的short(2byte);
意思是:以htonl()為例,主機字節(jié)轉網絡字節(jié)序,返回數(shù)據。
如果主機是小端字節(jié)序,這些函數(shù)將參數(shù)做相應的大小端轉換然后返回;
如果主機是大端字節(jié)序,這些 函數(shù)不做轉換,將參數(shù)原封不動地返回。

5. socket 編程

首先我們先簡單了解常用的三中套接字:

  1. 域用socket? ? ? (基于網絡socket下的本地模式,類似于命名管道,可參見:進程通信知識基礎【Linux】——下篇【命名管道,共享內存,信號量初識】-CSDN博客
  2. 原始socket? ? ?(一般用于一些工具制作——跳過傳輸層協(xié)議直接用于網絡層,甚至數(shù)據鏈路層)
  3. 網絡socket? ?
很明顯上面是適用于三種不同的場景,理論上需要三套不同的接口,但linux選擇只設計一套公用的接口,如下:
// 創(chuàng)建 socket 文件描述符 (TCP/UDP, 客戶端 + 服務器)
int socket(int domain, int type, int protocol);
// 綁定端口號 (TCP/UDP, 服務器) 
int bind(int socket, const struct sockaddr *address, socklen_t address_len);
// 開始監(jiān)聽socket (TCP, 服務器)
int listen(int socket, int backlog);
// 接收請求 (TCP, 服務器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);
// 建立連接 (TCP, 客戶端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
socket API 是一層抽象的網絡編程接口 , 適用于各種底層網絡協(xié)議 , IPv4 、 IPv6, 以及后面要講的 UNIX Domain Socket. 然而 , 各種網絡協(xié)議的地址格式并不相同
難道不會有沖突?有的,但解決了,這里我們來看這個參數(shù)類型—— sockaddr

sockaddr類型?

頭文件:<netinet/in.h>

linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

一,基于udp協(xié)議編程?

1. socket——創(chuàng)建套接字

linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp
socket本質是操作系統(tǒng)對 傳輸層的接口進行的封裝。(sys證明來自系統(tǒng)的接口)

?返回值:文件描述符作為返回值

?domain: 設置套接字類型(網絡通信,還是本地通信)
linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

type: 以 字節(jié)流方式發(fā)送;還是以 數(shù)據報形式
linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

protocol: 一般根據前兩參數(shù)就決定好了,設置為0即可。?

2. bind——將套接字強綁定?

(1. bind
// 綁定端口號 (TCP/UDP, 服務器) 
int bind(int socket, const struct sockaddr *address, socklen_t address_len);

需要區(qū)別C++11中std::bind,后者是C++11的包裝器,用于函數(shù)參數(shù)管理。這里的是三種socket通信綁定套接字的通用接口,下面是實例:

sockaddr_in結構體頭文件<netinet/in.h>

        // 2.讓操作系統(tǒng)將該進程與我們的套接字進行強綁定,以便內核中我們信息的獲取
        struct sockaddr_in local;
        // 全0填充,可以用memset,bzero
        bzero(&local, sizeof bzero);
        local.sin_family = AF_INET; // 設置通信類型
        // 服務器的ID和端口未來是要將數(shù)據發(fā)送到網絡中,數(shù)據就需要修改為大端。
        local.sin_port = htons(_port); 
        // 對IP地址補充:
        // 常見的是"192.234.222.111"——點分十進制字符串風格的IP地址,目的:用戶方便觀察
        // 分成四個領域,每個領域都是[0~255],也就是2^8,1字節(jié),所以IP,4字節(jié)可以完全表示
        // 如果網絡以上面字符串形式傳輸就是15字節(jié),所以需要15字節(jié) <-> 4字節(jié)(網絡)
        local.sin_addr.s_addr =  inet_addr(_id.c_str()); //4字節(jié)的ID也需要修改

        if (bind(socket_, (sockaddr*)&local, sizeof local) < 0)
        {
            Logmessage(FATIL, "%d:%s\n", errno, strerror(errno));
        }

如果綁定成功,接下來主機就從可以從該套接字中接收數(shù)據。

常見的網絡轉換數(shù)據接口,具體用法問AI

man inet_addr

linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

3. recvfrom——接受數(shù)據

linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

參數(shù)解析:

  • sockfd: 創(chuàng)建完的套接字返回文件標識符——還是遵從一切為文件
  • buf, len :信息緩沖區(qū)
  • flags : 默認為0,為阻塞方式接受信息
  • src_addr, addrlen :一個輸出型參數(shù),收集發(fā)送者套接字(IP + 端口)。
  • return :? 返回發(fā)送者發(fā)送字節(jié)數(shù)。
  • sockaddr*, socklen_t* :兩類型是輸出式參數(shù),用于記錄發(fā)送方套接字

4. sendto——發(fā)出信息

linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

需要注意的是socklen_t類型,需要

使用例子請看下面:

功能:一個客戶端,一個服務器,在同一臺機器上通過IP:127.0.0.1來實現(xiàn)互相數(shù)據發(fā)送。

        //服務器啟動
        int start()
        {
        char buf[1024];
        while (1)
        {
            //1.接受信息
            struct sockaddr_in peer;
            bzero(&peer, sizeof peer);
            socklen_t len = sizeof peer;
            ssize_t s_len = recvfrom(socket_, buf, (sizeof buf) - 1, 0, (struct                     
            sockaddr*)&peer, &len);
            if (s_len > 0)
            {
                buf[s_len] = 0; // 協(xié)議分析,這里我們先不說
                //解析發(fā)送目標
                uint16_t send_port = ntohs(peer.sin_port);
                std::string send_id = inet_ntoa(peer.sin_addr);
                printf("發(fā)送方 id:[%s] port:[%d]:%s\n",send_id.c_str(), send_port, buf);
            }
            //2.分析信息 

            //3.發(fā)出信息,我們選擇發(fā)送回
            sendto(socket_, buf, sizeof buf, 0, (struct sockaddr*)&peer, len);
            }   
        }

(詳細代碼鏈接,我將放到文章末尾)?

?遇到的問題

(1. 云服務器中以及無法分配IP問題

答:我們使用云服務器進行代碼學習時,自己無法分配除127.0.0.1的IP,即使是自己的云服務器IP,因為是供應商提供的虛擬IP,所以云服務器就不允許分配其他IP。

(2. IP:127.0.0.1更深層次的認識

答:為什么可以使用127.0.0.1 IP,因為這是一個本地環(huán)回的IP,在這個IP下數(shù)據經過本地協(xié)議棧后不會進入網絡,而是直接從棧底回到操作系統(tǒng),同時這也是適合本地網絡服務測試,如果接入網絡通信,沒有接通則大概率是網絡的原因。

(3. 關于服務端bind的優(yōu)化

?答:首先我們完善一下從上面代碼對bind的認識

linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

?修改方法:在添加IP地址時,將IP修改為任意IP即可

linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

宏 : INADDR_ANY? 本質上就是0

關于在Windows下使用客戶端

? ? ? ? 上面創(chuàng)建的客戶端都是linux下的客戶端,如果我們想在Windows下使用, -phread這個第三方庫就用不了,而客戶端就要更改源碼庫,使用window的網絡套接字接口,但好在幾乎類似,最后在VS本地運行即可。

自己實現(xiàn)的類一定要進行備注使用方法,返回值類型,以免代碼復用時,出現(xiàn)返回值類型問題!?。▌e問我為啥要單獨寫一行,因為在轉類型時,轉錯了,一直段錯誤,人都傻了,結果后面發(fā)現(xiàn),原來是自己實現(xiàn)類的用法忘記了,害,一個早上的教訓?。?/p>

源碼

下面的源碼介紹:cline端:基于多線程將送,收消息分離; service端:不綁定特定IP,實現(xiàn)接收,并回發(fā)消息。?

udb_socket簡單聊天室源碼:NetworkProgramming · 逆光/Linux - 碼云 - 開源中國 (gitee.com)

二,基于tcp協(xié)議編程

1. listen——服務端監(jiān)聽

?linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

功能:listen接口是用于創(chuàng)建一個被動的套接字,用于監(jiān)聽傳入的連接請求的接口。當一個套接字調用listen接口后,它將開始接受傳入的連接請求,并將這些請求排隊,等待被接受或拒絕。(就像一個飯店的外面的拉客人)

sockfd:監(jiān)聽用的套接字

backlog:?指定在拒絕新連接之前,操作系統(tǒng)可以排隊等待的最大連接數(shù)量。

返回值:0成功,-1失敗。

2. accept——服務端接收

linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

功能:accept()函數(shù)會在sockfd套接字上接受一個傳入的連接請求(阻塞式接收),并返回一個新的套接字描述符,用于和客戶端進行通信。同時,addr和addrlen參數(shù)會被填充上客戶端的地址信息。

        //1. 接受請求
        struct sockaddr_in send_;  //請求方信息
        bzero(&send_, sizeof send_);
        socklen_t len = sizeof send_;
        // accept會等待請求方申請,會處于阻塞狀態(tài)
        int actual_socket = accept(listen_socket_, (sockaddr*)&send_, &len);
        if ( actual_socket < 0 )
        {
            Logmessage(FATIL, "accept fail%d %s", errno, strerror(errno));
            continue;
        }

3. connect——客戶端請求

linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

在調用 connect() 函數(shù)后,系統(tǒng)會嘗試連接到指定的服務器地址。(多客戶端向服務端進行連接)

成功,返回值為0;如果連接失敗,返回值為-1,并且可以通過 errno 變量獲取具體的錯誤信息。

     // 1.保留目標信息
    struct sockaddr_in goal_service;
    bzero(&goal_service, sizeof goal_service);
    goal_service.sin_family = AF_INET;
    goal_service.sin_port = htons(atoi(args[2]));
    goal_service.sin_addr.s_addr = inet_addr(args[1]);
    // 2.建立連接
    if (connect(cline_socket, (sockaddr*)&goal_service, sizeof goal_service) < 0)
    {
        Logmessage(FATIL, "cline connect fail %d %s", errno, strerror(errno));
        exit(1);
    }

4. send & recev

linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

功能:?send()函數(shù)將數(shù)據從buf緩沖區(qū)發(fā)送到已連接的套接字或者未連接的套接字(后者的UDP多用sendto)

  • sockfd:要發(fā)送數(shù)據的套接字描述符。
  • flags:傳遞給send()函數(shù)的標志參數(shù),通常為0
  • 返回值:成功,返回字節(jié)數(shù);失敗,-1

linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

功能:recv()函數(shù)會阻塞程序,直到接收到足夠的數(shù)據或發(fā)生錯誤。

sockfd:指定要接收數(shù)據的套接字描述符。

flags:指定接收數(shù)據的附加選項,通常為0。

返回值:成功,字節(jié)數(shù);0,連接關閉;異常,-1。

三,服務端與客戶端通信小項目

全名:基于TCP協(xié)議實現(xiàn)的線程池的服務端對客戶端進行相互通信的小項目

結構圖一覽

linux c++ udp socket bind fcntl,網絡,c語言,c++,linux,服務器,開發(fā)語言,udp

我的體會,客戶端以及服務端的設計,在UDP設計中基本已經寫過了,TCP只是有一些小改動;然后就是線程池也是直接使用了,前面我們所寫的線程池小項目,總體來說考驗我們的代碼整合能力吧。

源碼?

線程池小項目:Tcp_NetworkProgramming · 逆光/Linux - 碼云 - 開源中國 (gitee.com)

有人會說,萬一我不想用線程池來實現(xiàn)服務端處理客戶端的請求呢?而是使用一些比較小型的呢?答:有,而且不止幾種

首先我們?yōu)槭裁匆镁€程池這個結構?

答: 服務端不能一次只接受一個客戶端的請求,所以需要其他結構(子進程或多線程)來滿足客戶端的服務,主線程只要接收請求,分配任務即可。

服務端處理客戶端請求方法——由簡到密

1. 單進程處理

       void start()
        {
        signal(SIGCHLD, SIG_IGN);
        //循環(huán)接受信息
        while (1)
        {
        //1. 接受請求
        struct sockaddr_in send_;  //請求方信息
        bzero(&send_, sizeof send_);
        socklen_t len = sizeof send_;
        // accept會等待請求方申請,會處于阻塞狀態(tài)
        int actual_socket = accept(listen_socket_, (sockaddr*)&send_, &len);
        if ( actual_socket < 0 )
        {
            Logmessage(FATIL, "accept fail%d %s", errno, strerror(errno));
            continue;
        }
        // 連接成功
        std::string send_ip = inet_ntoa(send_.sin_addr);
        uint16_t send_port = ntohs(send_.sin_port);
        Logmessage(NOWAIN, "連接成功,客戶端為 ip:%s 端口號:%d", send_ip.c_str(), send_port);

        // (1.0)服務器處理信息——單進程版本
        // //2. 分析處理數(shù)據
        server_dispose(actual_socket, send_ip, send_port);

? 缺點:無法滿足服務器多客戶端連接

2.?子進程處理

        // 連接成功
        std::string send_ip = inet_ntoa(send_.sin_addr);
        uint16_t send_port = ntohs(send_.sin_port);
        Logmessage(NOWAIN, "連接成功,客戶端為 ip:%s 端口號:%d", send_ip.c_str(), send_port);

        // (2.0) 優(yōu)化——子進程版本
        pid_t pd = fork();
        if (pd == 0)
        {
            //2. 分析處理數(shù)據
            close(listen_socket_); //子進程拷貝一份父進程的文件描述服表
            server_dispose(actual_socket, send_ip, send_port);
            exit(0);
        }
        close(actual_socket); // 子進程里保留了該文件描述符,父進程已經不需要了
        // 按照曾經的理解,現(xiàn)在應該讓父進程進行等待子進程,但多少都存在些問題。
        // 1. waitpid阻塞式等待,不就跟單線程一樣?
        // 2. 非阻塞式等待,需要構建子進程管理結構比較麻煩,而且我們不需要關心子進程的返回情況。
        // 因此我們可以采用信號知識,忽略子進程返回。
        // 操作細則:在service啟動時 signal(SIGCHLD, SIG_IGN);

2.1.?孫子進程處理

        // 連接成功
        std::string send_ip = inet_ntoa(send_.sin_addr);
        uint16_t send_port = ntohs(send_.sin_port);
        Logmessage(NOWAIN, "連接成功,客戶端為 ip:%s 端口號:%d", send_ip.c_str(), send_port);
        
        // (2.1) ———— 子進程退出,孫子進程讓1接管
        pid_t pd = fork();
        if (pd == 0)
        {
            //2. 分析處理數(shù)據
            close(listen_socket_); //子進程拷貝一份父進程的文件描述服表
            if (fork() > 0) exit(0); // 孫子進程變成孤兒進程,讓bash接管
            server_dispose(actual_socket, send_ip, send_port);
            exit(0);
        }
        waitpid(pd, nullptr, 0); // 子進程進入立馬退出,父進程幾乎不阻塞等待

缺點:雖然滿足了服務端可以同時滿足多個客戶端連接,但是進程的創(chuàng)建會比較大的開銷 。?

3. 多線程處理


    static void* pth_service(void* args)
    {
        PthreadData* data = static_cast<PthreadData*>(args);
        // 進來先剝離線程,這樣主線程不用等待返回
        pthread_detach(pthread_self());
        server_dispose(data->_actual_socket, data->_ip, data->_port);
        close(data->_actual_socket);
        delete data;
        return nullptr;
    }

        .....
        .....
        // 連接成功
        std::string send_ip = inet_ntoa(send_.sin_addr);
        uint16_t send_port = ntohs(send_.sin_port);
        Logmessage(NOWAIN, "連接成功,客戶端為 ip:%s 端口號:%d", send_ip.c_str(), send_port);

        // (3.0) ———— 多線程版本
        pthread_t it = -1;  // 線程的標識號先默認為1,后面在設置。
        PthreadData* data =  new PthreadData;
        data->_ip = send_ip;
        data->_port = send_port;
        data->_actual_socket = actual_socket;
        pthread_create(&it, nullptr, pth_service, (void*)data);
    

缺點:1. 沒有設置最大線程數(shù),在高壓情況下有可能會導致service服務崩潰。2. 短時間內大量請求,線程開辟消耗比較大的資源。?

4. 線程池處理

          // 連接成功
        std::string send_ip = inet_ntoa(send_.sin_addr);
        uint16_t send_port = ntohs(send_.sin_port);
        Logmessage(NOWAIN, "連接成功,客戶端為 ip:%s 端口號:%d", send_ip.c_str(), send_port);

        // (4.0) ———— 啟用線程池
        // 讓線程來進行對網絡端的信息進行處理
        Task_add* task = new Task_add(actual_socket, send_port, send_ip);
        _thr_pool->push(task);

        // 交換策略:服務端未被占滿時,來一條就交換任務隊列
        if (_thr_pool->Get_queue_task_size() == 0 
        && _thr_pool->Get_queue_task_reserver_size() != 0)
        {
        _thr_pool->swap_queue();
        }

功能基本上沒什么問題了,但我們在客戶端處理邏輯上是循環(huán),意味著該線程不會退出,也就是長連接。意味著,客戶端的最大連接數(shù)就是線程池的數(shù)量,如果客戶端邏輯是短連接,就不會出現(xiàn)線程池一直占滿的情況了。

以上的編程是我們在應用層使用的編碼,往后我們將向下深入理解網絡理解。

下期:TCP協(xié)議原理

結語

? ?本小節(jié)就到這里了,感謝小伙伴的瀏覽,如果有什么建議,歡迎在評論區(qū)評論,如果給小伙伴帶來一些收獲請留下你的小贊,你的點贊和關注將會成為博主創(chuàng)作的動力文章來源地址http://www.zghlxwxcb.cn/news/detail-844764.html

到了這里,關于網絡編程套接字應用分享【Linux &C/C++ 】【UDP應用 | TCP應用 | TCP&線程池小項目】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

領支付寶紅包贊助服務器費用

相關文章

  • 【網絡】網絡編程套接字(一)

    【網絡】網絡編程套接字(一)

    在前面我們說過可以使用IP地址來標識一臺主機,但是我們光有IP地址就可以完成通信了嘛? 答案是:不可以,當我們的主機接收到了數(shù)據以后還要確定這個數(shù)據是發(fā)送給哪一個進程的,兩臺主機的兩個軟件進行網絡通信時,我們還需要有一個其他的標識來區(qū)分出這個數(shù)據要給

    2024年02月06日
    瀏覽(96)
  • 【JaveEE】網絡編程之TCP套接字、UDP套接字

    【JaveEE】網絡編程之TCP套接字、UDP套接字

    目錄 1.網絡編程的基本概念 1.1為什么需要網絡編程? 1.2服務端與用戶端 1.3網絡編程五元組? 1.4套接字的概念 2.UDP套接字編程 2.1UDP套接字的特點 ?2.2UDP套接字API 2.2.1DatagramSocket類 2.2.2DatagramPacket類? 2.2.3基于UDP的回顯程序 2.2.4基于UDP的單詞查詢? 3.TCP套接字編程 3.1TCP套接字的特

    2023年04月13日
    瀏覽(915)
  • 【JavaEE】網絡編程之TCP套接字、UDP套接字

    【JavaEE】網絡編程之TCP套接字、UDP套接字

    目錄 1.網絡編程的基本概念 1.1為什么需要網絡編程? 1.2服務端與用戶端 1.3網絡編程五元組? 1.4套接字的概念 2.UDP套接字編程 2.1UDP套接字的特點 ?2.2UDP套接字API 2.2.1DatagramSocket類 2.2.2DatagramPacket類? 2.2.3基于UDP的回顯程序 2.2.4基于UDP的單詞查詢? 3.TCP套接字編程 3.1TCP套接字的特

    2023年04月20日
    瀏覽(120)
  • 【Linux網絡編程】網絡編程套接字二

    【Linux網絡編程】網絡編程套接字二

    喜歡的點贊,收藏,關注一下把! TCP和UDP在編程接口上是非常像的,前面我們說過TCP是面向連接的,UDP我們上篇博客也寫過了,我們發(fā)現(xiàn)UDP服務端客戶端寫好啟動直接就發(fā)消息了沒有建立連接。TCP是建立連接的,注定在寫的時候肯定有寫不一樣的地方。具體怎么不一樣,我們

    2024年04月15日
    瀏覽(101)
  • 網絡編程套接字(3)——Java數(shù)據報套接字(UDP協(xié)議)

    網絡編程套接字(3)——Java數(shù)據報套接字(UDP協(xié)議)

    目錄 一、Java數(shù)據報套接字通信模型 二、UDP數(shù)據報套接字編程 1、DatagramSocket ????????(1)DatagramSocket構造方法 ????????(2)DatagramSocket方法 2、DatagramPacket ????????(1)DatagramPacket構造方法 ????????(2)DatagramPacket方法 3、InetSocketAddress 三、代碼示例:回顯服務

    2024年03月12日
    瀏覽(233)
  • 網絡編程【TCP流套接字編程】

    網絡編程【TCP流套接字編程】

    目錄 TCP流套接字編程 1.ServerSocket API 2.Socket API 3.TCP中的長短連接 4.回顯程序(短連接) 5.服務器和客戶端它們的交互過程 6.運行結果及修改代碼 ? ??兩個核心: ServerSocket? ? ?Socket 1.ServerSocket API ? ServerSocket 是創(chuàng)建?TCP服務端Socket的API ServerSocket 構造方法: ServerSocket 方法 :

    2023年04月12日
    瀏覽(573)
  • UDP網絡套接字編程

    UDP網絡套接字編程

    先來說說數(shù)據在網絡上的傳輸過程吧,我們知道系統(tǒng)其實終究是根據馮諾依曼來構成的,而網絡數(shù)據是怎么發(fā)的呢? 其實很簡單,網絡有五層。如下: 如上圖,我們知道的是,每層對應的操作系統(tǒng)中的那些地方,有些可能說是網絡有七層,其實和這個五層一樣的。下面我們

    2024年02月04日
    瀏覽(97)
  • 【網絡編程】網絡編程套接字(三)TCP網絡程序

    【網絡編程】網絡編程套接字(三)TCP網絡程序

    與前邊的UDP網絡程序相同,創(chuàng)建套接字的接口都是socket,下邊對socket接口進行介紹: 協(xié)議家族選擇AF_INET,因為我們要進行網絡通信。 而第二個參數(shù),為服務類型,傳入SOCK_STREAM,我們編寫TCP程序,所以要選擇流式的服務。 第三個參數(shù)默認傳入0,由前兩個參數(shù)就可以推出這是

    2024年02月16日
    瀏覽(92)
  • 【網絡編程】網絡編程 和 Socket 套接字認識

    【網絡編程】網絡編程 和 Socket 套接字認識

    ?個人主頁:bit me?? ?當前專欄:Java EE初階?? 用戶在瀏覽器中,打開在線視頻網站,如優(yōu)酷看視頻,實質是通過網絡,獲取到網絡上的一個視頻資源。 與本地打開視頻文件類似,只是視頻文件這個資源的來源是網絡。 相比本地資源來說,網絡提供了更為豐富的網絡資源:

    2023年04月15日
    瀏覽(516)
  • 網絡編程套接字 | 預備知識

    網絡編程套接字 | 預備知識

    在之后的文章中我們將來講解網絡編程中的相關知識點,再本文中我們首先來講解一下網絡編程中的預備知識: 在IP數(shù)據包中有兩個IP地址分別是源IP地址和目的IP地址,此時這里就會出現(xiàn)一個問題就是:如果我們光有IP地址,是無法完成通信的。有了IP地址只能夠將消息發(fā)送到

    2024年02月09日
    瀏覽(93)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包