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

Linux網絡編程(四)——UDP通信

這篇具有很好參考價值的文章主要介紹了Linux網絡編程(四)——UDP通信。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

0x01 UDP協(xié)議

一、UDP通信簡介以及接口

二、UDP的接口

三、UDP收發(fā)例程

0x02 廣播

一、設置廣播數(shù)據(jù)函數(shù)接口

二、廣播代碼實現(xiàn)

0x03 組播(多播)

一、組播地址

二、設置組播函數(shù)接口

三、代碼實現(xiàn)


0x01 UDP協(xié)議

一、UDP通信簡介以及接口

linux udp通信,Linux系統(tǒng)編程,udp,linux,操作系統(tǒng),嵌入式,網絡協(xié)議

UDP是一個面向無連接的,不可靠的服務,功能即為在IP的數(shù)據(jù)報服務之上增加了最基本的服務:復用和分用以及差錯檢測。

  • UDP通信不需要建立連接,因此不需要進行connect()操作。

  • UDP通信過程中,每次都需要指定數(shù)據(jù)接收端的IP和端口。

  • UDP不對收到的數(shù)據(jù)進行排序,在UDP報文的首部中并沒有關于數(shù)據(jù)順序的信息。

  • UDP對接收到的數(shù)據(jù)報不回復確認信息,發(fā)送端不知道數(shù)據(jù)是否被正確接收,也不會重發(fā)數(shù)據(jù)。

  • 如果發(fā)生了數(shù)據(jù)丟失,不存在丟一半的情況,如果丟當前這個數(shù)據(jù)報就全部丟失了。

  • UDP沒有擁塞控制,應用層能夠更好的控制要發(fā)送的數(shù)據(jù)和發(fā)送時間,網絡中的擁塞控制也不會影響主機的發(fā)送速率,能容忍一些數(shù)據(jù)的丟失,但是不能允許有較大的時延。

二、UDP的接口

#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
    - 參數(shù):
        - sockfd : 通信的fd
        - buf : 要發(fā)送的數(shù)據(jù)
        - len : 發(fā)送數(shù)據(jù)的長度
        - flags : 0
        - dest_addr : 通信的另外一端的地址信息
        - addrlen : 地址的內存大小
    - 返回:
        -n :發(fā)送字節(jié)的數(shù)量 
        -0 :失敗
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
    - 參數(shù):
        - sockfd : 通信的fd
        - buf : 接收數(shù)據(jù)的數(shù)組
        - len : 數(shù)組的大小
        - flags : 0
        - src_addr : 用來保存另外一端的地址信息,不需要可以指定為NULL
        - addrlen : 地址的內存大小
    - 返回:
        - n:成功返回字節(jié)個數(shù)
        - 0:失敗

三、UDP收發(fā)例程

客戶端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

int main() {

    // 1.創(chuàng)建一個通信的socket
    int fd = socket(PF_INET, SOCK_DGRAM, 0);
    
    if(fd == -1) {
        perror("socket");
        exit(-1);
    }   

    // 服務器的地址信息
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    inet_pton(AF_INET, "127.0.0.1", &saddr.sin_addr.s_addr);

    int num = 0;
    // 3.通信
    while(1) {

        // 發(fā)送數(shù)據(jù)
        char sendBuf[128];
        sprintf(sendBuf, "hello , i am client %d \n", num++);
        sendto(fd, sendBuf, strlen(sendBuf) + 1, 0, (struct sockaddr *)&saddr, sizeof(saddr));

        // 接收數(shù)據(jù)
        int num = recvfrom(fd, sendBuf, sizeof(sendBuf), 0, NULL, NULL);
        printf("server say : %s\n", sendBuf);

        sleep(1);
    }

    close(fd);
    return 0;
}

? 服務端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

int main() {

    // 1.創(chuàng)建一個通信的socket
    int fd = socket(PF_INET, SOCK_DGRAM, 0);
    
    if(fd == -1) {
        perror("socket");
        exit(-1);
    }   

    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(9999);
    addr.sin_addr.s_addr = INADDR_ANY;

    // 2.綁定
    int ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
    if(ret == -1) {
        perror("bind");
        exit(-1);
    }

    // 3.通信
    while(1) {
        char recvbuf[128];
        char ipbuf[16];

        struct sockaddr_in cliaddr;
        int len = sizeof(cliaddr);

        // 接收數(shù)據(jù)
        int num = recvfrom(fd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&cliaddr, &len);

        printf("client IP : %s, Port : %d\n", 
            inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, ipbuf, sizeof(ipbuf)),
            ntohs(cliaddr.sin_port));

        printf("client say : %s\n", recvbuf);

        // 發(fā)送數(shù)據(jù)
        sendto(fd, recvbuf, strlen(recvbuf) + 1, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));

    }

    close(fd);
    return 0;
}

0x02 廣播

在局域網中可以使用單播的形式,即一對一通訊,也可以使用廣播的形式,即向子網中多臺計算機發(fā)送消息,并且子網中所有的計算機都可以接收到發(fā)送方發(fā)送的消息,每個廣播消息都包含一個特殊的IP地址,這個IP中子網內主機標志部分的二進制全部為1(即主機IP為255)。

例如192.168.10.20,其中20為主機IP,其他的為網絡IP。若主機IP為0,則代表這是個子網IP;若為255,則代表為廣播IP。

  • 只能在局域網中使用

  • 客戶端需要綁定服務器廣播使用的端口,才可以接收到廣播消息,也就是說客戶端需要綁定IP為192.168.10.255,并且需要綁定與廣播的服務器的端口。

一、設置廣播數(shù)據(jù)函數(shù)接口

// 設置廣播屬性的函數(shù)
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
    - sockfd : 文件描述符
    - level : SOL_SOCKET
    - optname : SO_BROADCAST
    - optval : int類型的值,為1表示允許廣播
    - optlen : optval的大小	

二、廣播代碼實現(xiàn)

服務端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

int main() {

    // 1.創(chuàng)建一個通信的socket
    int fd = socket(PF_INET, SOCK_DGRAM, 0);
    if(fd == -1) {
        perror("socket");
        exit(-1);
    }   

    // 2.設置廣播屬性
    int op = 1;
    setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &op, sizeof(op));
    
    // 3.創(chuàng)建一個廣播的地址
    struct sockaddr_in cliaddr;
    cliaddr.sin_family = AF_INET;
    cliaddr.sin_port = htons(9999);
    inet_pton(AF_INET, "192.168.193.255", &cliaddr.sin_addr.s_addr);	//本機的廣播地址使用命令ifconfig查看

    // 3.通信
    int num = 0;
    while(1) {
       
        char sendBuf[128];
        sprintf(sendBuf, "hello, client....%d\n", num++);
        // 發(fā)送數(shù)據(jù)
        sendto(fd, sendBuf, strlen(sendBuf) + 1, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
        printf("廣播的數(shù)據(jù):%s\n", sendBuf);
        sleep(1);
    }

    close(fd);
    return 0;
}

客戶端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

int main() {

    // 1.創(chuàng)建一個通信的socket
    int fd = socket(PF_INET, SOCK_DGRAM, 0);
    if(fd == -1) {
        perror("socket");
        exit(-1);
    }   

    struct in_addr in;

    // 2.客戶端綁定本地的IP和端口
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(9999);
    addr.sin_addr.s_addr = INADDR_ANY;		//綁定本機IP

    int ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
    if(ret == -1) {
        perror("bind");
        exit(-1);
    }

    // 3.通信
    while(1) {
        
        char buf[128];
        // 接收數(shù)據(jù)
        int num = recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL);
        printf("server say : %s\n", buf);

    }

    close(fd);
    return 0;
}

0x03 組播(多播)

單播地址標識單個 IP 接口,廣播地址標識某個子網的所有 IP 接口,多播地址標識一組 IP 接口。單播和廣播是尋址方案的兩個極端(要么單個要么全部),多播則意在兩者之間提供一種折中方案。多播數(shù)據(jù)報只應該由對它感興趣的接口接收,也就是說由運行相應多播會話應用系統(tǒng)的主機上的接口接收。另外,廣播一般局限于局域網內使用,而多播則既可以用于局域網,也可以跨廣域網使用。

  • 組播既可以用于局域網,也可以用于廣域網。

  • 客戶端需要加入多播組,才能接收到多播的數(shù)據(jù)。

一、組播地址

IP多播通信必須依賴于IP多播地址,在IPv4中它的范圍從224.0.0.0239.255.255.255,并被劃分為局部鏈接多播地址、預留多播地址和管理權限多播地址三類:

IP地址 說明
224.0.0.0~224.0.0.255 局部鏈接多播地址:是為路由協(xié)議和其它用途保留的地址,路由器并不轉發(fā)屬于此范圍的IP包
224.0.1.0~224.0.1.255 預留多播地址:公用組播地址,可用于Internet;使用前需要申請
224.0.2.0~238.255.255.255 預留多播地址:用戶可用組播地址(臨時組地址),全網范圍內有效
239.0.0.0~239.255.255.255 本地管理組播地址,可供組織內部使用,類似于私有 IP 地址,不能用于 Internet,可限制多播范圍

二、設置組播函數(shù)接口

int setsockopt(int sockfd, int level, int optname,const void *optval,socklen_t optlen);
    // 服務器設置多播的信息,外出接口
    - level : IPPROTO_IP
    - optname : IP_MULTICAST_IF
    - optval : struct in_addr
        typedef uint32_t in_addr_t;
        struct in_addr
        {
        in_addr_t s_addr;
        };

    // 客戶端加入到多播組:
    - level : IPPROTO_IP
    - optname : IP_ADD_MEMBERSHIP
    - optval : struct ip_mreq	
        struct ip_mreq
        {
            /* IP multicast address of group.*/
            struct in_addr imr_multiaddr;  // 組播的IP地址
            /* Local IP address of interface.*/
            struct in_addr imr_interface;	// 本地的IP地址
        };

以上的參數(shù)設置主要參照于《UNIX網絡編程》。

三、代碼實現(xiàn)

服務端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

int main() {

    // 1.創(chuàng)建一個通信的socket
    int fd = socket(PF_INET, SOCK_DGRAM, 0);
    if(fd == -1) {
        perror("socket");
        exit(-1);
    }   

    // 2.設置多播的屬性,設置外出接口
    struct in_addr imr_multiaddr;
    // 初始化多播地址
    inet_pton(AF_INET, "239.0.0.10", &imr_multiaddr.s_addr);
    setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, &imr_multiaddr, sizeof(imr_multiaddr));
    
    // 3.初始化客戶端的地址信息,在多播中需要表明客戶端的信息
    struct sockaddr_in cliaddr;
    cliaddr.sin_family = AF_INET;
    cliaddr.sin_port = htons(9999);
    inet_pton(AF_INET, "239.0.0.10", &cliaddr.sin_addr.s_addr);

    // 3.通信
    int num = 0;
    while(1) {
       
        char sendBuf[128];
        sprintf(sendBuf, "hello, client....%d\n", num++);
        // 發(fā)送數(shù)據(jù)
        sendto(fd, sendBuf, strlen(sendBuf) + 1, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
        printf("組播的數(shù)據(jù):%s\n", sendBuf);
        sleep(1);
    }

    close(fd);
    return 0;
}

客戶端代碼:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

int main() {

    // 1.創(chuàng)建一個通信的socket,使用UDP通信協(xié)議
    int fd = socket(PF_INET, SOCK_DGRAM, 0);
    if(fd == -1) {
        perror("socket");
        exit(-1);
    }   

    struct in_addr in;
    // 2.客戶端綁定本地的IP和端口
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(9999);
    addr.sin_addr.s_addr = INADDR_ANY;

    int ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
    if(ret == -1) {
        perror("bind");
        exit(-1);
    }

    struct ip_mreq op;
    inet_pton(AF_INET, "239.0.0.10", &op.imr_multiaddr.s_addr);
    op.imr_interface.s_addr = INADDR_ANY;

    // 加入到多播組
    setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &op, sizeof(op));

    // 3.通信
    while(1) {
        
        char buf[128];
        // 接收數(shù)據(jù)
        int num = recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL);
        printf("server say : %s\n", buf);

    }

    close(fd);
    return 0;
}

需要注意的是,多播與廣播只能UDP,對于TCP只能一對一。文章來源地址http://www.zghlxwxcb.cn/news/detail-526384.html

到了這里,關于Linux網絡編程(四)——UDP通信的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

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

相關文章

  • 【Linux】網絡基礎+UDP網絡套接字編程

    【Linux】網絡基礎+UDP網絡套接字編程

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

    2024年02月08日
    瀏覽(89)
  • 【Linux網絡】網絡編程套接字(預備知識+UDP)

    【Linux網絡】網絡編程套接字(預備知識+UDP)

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

    2024年02月19日
    瀏覽(93)
  • 【Linux網絡編程】基于UDP實現(xiàn)多人聊天室

    【Linux網絡編程】基于UDP實現(xiàn)多人聊天室

    UDP(User Datagram Protocol)用戶數(shù)據(jù)報協(xié)議,是不可靠的無連接的協(xié)議。在數(shù)據(jù)發(fā)送前,因為不需要進行連接,所以可以進行高效率的數(shù)據(jù)傳輸。 數(shù)據(jù)報格式套接字 SOCK_DGRAM 采用UDP只管發(fā)送數(shù)據(jù)而不去驗證發(fā)送數(shù)據(jù)的正確性,不論傳輸是否被接收,數(shù)據(jù)流是否有丟失,都不再重新發(fā)

    2024年02月08日
    瀏覽(27)
  • 【Linux Network】網絡編程套接字(代碼練習)—UDP

    【Linux Network】網絡編程套接字(代碼練習)—UDP

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

    2024年02月03日
    瀏覽(234)
  • 【Linux網絡】網絡編程套接字 -- 基于socket實現(xiàn)一個簡單UDP網絡程序

    【Linux網絡】網絡編程套接字 -- 基于socket實現(xiàn)一個簡單UDP網絡程序

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

    2024年02月12日
    瀏覽(848)
  • 初學記錄【linux應用】 TCP/UDP 網絡編程 C語言

    初學記錄【linux應用】 TCP/UDP 網絡編程 C語言

    以下內容分別為TCP 與 UDP編程,內容有相似或者重合部分,可根據(jù)流程 相互對照學習,都已經附上源碼 。 **1.** socket 創(chuàng)建 tcp套接字 (監(jiān)聽的套接字) 2、IPv4套接字地址結構 #include netinet/in.h struct in_addr: 如果使用 Internet 所以 sin_family 一般為 AF_INET。 ? sin_addr 設置為 INADDR_AN

    2024年02月03日
    瀏覽(27)
  • C/C++ Linux Socket網絡編程 TCP 與 UDP

    C/C++ Linux Socket網絡編程 TCP 與 UDP

    之前已經學習了QT的socket編程 和 C/C++在window環(huán)境的socket編程,現(xiàn)在再來學習一波C/C++在Linux環(huán)境下的socket編程,為以后學習C++ Linux 服務器開發(fā)做準備。 目錄 一、Socket簡介 二、Socket編程基礎 1. 網絡字節(jié)序 2. sockaddr數(shù)據(jù)結構 3. IP地址轉換函數(shù) 三、TCP編程函數(shù) 1. socket函數(shù) 2.?bi

    2024年02月02日
    瀏覽(25)
  • 【探索Linux】P.28(網絡編程套接字 —— 簡單的UDP網絡程序模擬實現(xiàn))

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

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

    2024年04月08日
    瀏覽(584)
  • 【QT網絡編程】實現(xiàn)UDP協(xié)議通信

    【QT網絡編程】實現(xiàn)UDP協(xié)議通信

    Internet 協(xié)議集支持一個無連接的傳輸協(xié)議,該協(xié)議稱為用戶數(shù)據(jù)報協(xié)議(UDP,User Datagram Protocol)。UDP 為應用程序提供了 一種無需建立連接就可以發(fā)送封裝的 IP 數(shù)據(jù)包的方法 。RFC 768 描述了 UDP。 UDP協(xié)議根據(jù)消息傳送模式可以分為: 單播(Unicast)、組播(Multicast)和廣播(

    2024年02月02日
    瀏覽(26)
  • 基于UDP/TCP的網絡通信編程實現(xiàn)

    基于UDP/TCP的網絡通信編程實現(xiàn)

    紅色是心中永不褪色的赤誠 操作系統(tǒng)為網絡編程提供了 Socket api , Socket是基于TCP/IP協(xié)議的網絡通信的基本單元, 基于Socket的網絡程序開發(fā)就是 網絡編程. 由于直接與應用層聯(lián)系的是傳輸層, 所以針對應用層協(xié)議(TCP, UDP), Shocket提供了三種套接字, 分別是 流套接字(使用TCP) , 數(shù)據(jù)報

    2024年02月08日
    瀏覽(33)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包