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

UDP多播:一對多數(shù)據(jù)收發(fā)

這篇具有很好參考價值的文章主要介紹了UDP多播:一對多數(shù)據(jù)收發(fā)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

多播

1.先來回顧一下,UDP廣播。一個服務器進行廣播,那么同一網(wǎng)絡的所有主機都會收到信息。那么這個時候,有可能并不是所有主機都需要收到廣播數(shù)據(jù)信息,只是一部分主機需要收到廣播數(shù)據(jù)信息而已。
2.UDP通信中的多播。多播是向特定組中的所有的主機發(fā)送數(shù)據(jù)的方法,多播也稱為組播。舉個容易理解的例子:我們在qq/wechat 中有10個聯(lián)系好友,拉了其中6個聯(lián)系好友建立了一個群。那么其他4個好友肯定收不到群里的消息。
3.多播數(shù)據(jù)傳輸?shù)奶攸c:
3.1 多播是向特定組中的所有主機傳輸數(shù)據(jù)的方法,多播也稱之為組播。
3.2 多播數(shù)據(jù)傳輸?shù)奶攸c。
a.多播發(fā)送者針對特定的多播組,只發(fā)送1次數(shù)據(jù),組內(nèi)主機均可收到數(shù)據(jù)
b.主機加入特定組,即可接收改組中的多播數(shù)據(jù)
c.多播組可在IP地址范圍內(nèi)任意增加

關鍵問題:如何收發(fā)多播數(shù)據(jù)?

1.多播組是一個D類地址(224.0.0.0 ~ 239.255.255.255)
2.加入多播組,可以理解為UDP網(wǎng)絡程序進行的申請(也就是申請D類地址)
2.1 如:申請接收發(fā)往 239.234.111.222 的多播數(shù)據(jù)
2.2 即:設置熟悉(IPPROTO_IP,IP_ADD_MEMBERSHIP)
3.發(fā)送多播數(shù)據(jù)的方式,與發(fā)送普通UDP數(shù)據(jù)的方式相同
3.1 預備操作:設置熟悉,如:(IPPROTO_IP,IP_MULTICAST_TTL)

注意事項

1.加入同一個多播組的主機不一定在同一個網(wǎng)絡中
2.因此,必須設置多播數(shù)據(jù)的最多轉(zhuǎn)發(fā)次數(shù)(TTL)
3.TTL (即:Time to Live) 是決定數(shù)據(jù)傳遞距離的注意因素
4.TTL 用整數(shù)表示,并且每經(jīng)過1個路由器就減少1
5.當TTL變?yōu)?時候,數(shù)據(jù)無法繼續(xù)傳遞,只能銷毀

多播程序設計:發(fā)送端

1.IP_MULTICAST_TTL :用于設置多播數(shù)據(jù)的 “最遠傳播距離”,默認:1
2.IP_MULTICAST_IF :用于設置多播數(shù)據(jù)從哪一個網(wǎng)絡接口(網(wǎng)卡)發(fā)送出去:默認:0.0.0.0 (也就是讓操作系統(tǒng)決定使用哪一個網(wǎng)口)
3.IP_MULTICAST_LOOP :用于設置多播數(shù)據(jù)是否發(fā)送會本機,默認:1

發(fā)送端:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
    int server = 0;
    struct sockaddr_in saddr = {0};
    int client = 0;
    struct sockaddr_in remote = {0};
    socklen_t asize = 0;
    int len = 0;
    char buf[32] = "Software";
    int r = 0;
    //int brd = 1;

    server = socket(PF_INET, SOCK_DGRAM, 0);

    if( server == -1 )
    {
        printf("server socket error\n");
        return -1;
    }

    saddr.sin_family = AF_INET;
    saddr.sin_addr.s_addr = htonl(INADDR_ANY); // 本機地址
    saddr.sin_port = htons(8888);

    if( bind(server, (struct sockaddr*)&saddr, sizeof(saddr)) == -1 )
    {
        printf("udp server bind error\n");
        return -1;
    }

    printf("udp server start success\n");

    remote.sin_family = AF_INET;
    remote.sin_addr.s_addr = inet_addr("224.1.1.168"); //設置一個多播地址
    remote.sin_port = htons(9000);

    // brd = 0;

    //setsockopt(server, SOL_SOCKET, SO_BROADCAST, &brd, sizeof(brd));

    while( 1 )
    {
        len = sizeof(remote);

        r = strlen(buf);
        
        sendto(server, buf, r, 0, (struct sockaddr*)&remote, len);

        sleep(1);
    }
    
    close(server);

    return 0;
}

接收端:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
    int sock = 0;
    struct sockaddr_in addr = {0};
    struct sockaddr_in remote = {0};
    int len = 0;
    char buf[128] = {0};
    char input[32] = {0};
    int r = 0;

    //多播
    struct ip_mreq group={0};

    sock = socket(PF_INET, SOCK_DGRAM, 0);

    if( sock == -1 )
    {
        printf("socket error\n");
        return -1;
    }

    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(9000);

    if( bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1 )
    {
        printf("udp bind error\n");
        return -1;
    }

    //remote.sin_family = AF_INET;
    //remote.sin_addr.s_addr = inet_addr("127.0.0.1");
    //remote.sin_port = htons(8888);

    group.imr_multiaddr.s_addr=inet_addr("224.1.1.168");
    group.imr_interface.s_addr=htonl(INADDR_ANY); //local host
    //這里INADDR_ANY 為0.0.0.0 通過看ipconfig/ifconfig 可以看到有多個
    //網(wǎng)絡ip地址,這個時候讓操作系統(tǒng)選擇哪一個端口進行多播數(shù)據(jù)收發(fā)。
    //在實際的工程中需要明確指定需要哪一個網(wǎng)絡地址進行多播數(shù)據(jù)收發(fā),
    //不能完全依賴操作系統(tǒng),否者有時候能夠收到數(shù)據(jù),有時候收不到數(shù)據(jù)。
    
    setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,&group,sizeof(group));

    while( 1 )
    {
        len=sizeof(remote);

        r = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr*)&remote, &len);

        if( r > 0 )
        {
            buf[r] = 0;

            printf("Receive: %s\n", buf);
        }
        else
        {
            break;
        }
    }

    close(sock);

    return 0;
}
運行結果:
發(fā)送端:
wj@ubuntu:~/DTSocket/17$ gcc mul_tx_server.c -o mul_tx_server.out
wj@ubuntu:~/DTSocket/17$ ./mul_tx_server.out 
udp server start success

接收端:
wj@ubuntu:~/DTSocket/17$ gcc mul_rx_client.c -o mul_rx_client.out
wj@ubuntu:~/DTSocket/17$ ./mul_rx_client.out 
Receive: Software
Receive: Software
Receive: Software

demo2:
//
//

小結:
1.單播:一對一數(shù)據(jù)發(fā)送,即:指定目標主機發(fā)送數(shù)據(jù)
2.廣播:
2.1 本地廣播:本地局域網(wǎng)廣播數(shù)據(jù),所有主機均可接收數(shù)據(jù)
2.2 直接廣播:直接網(wǎng)絡廣播數(shù)據(jù),目標網(wǎng)絡中的主機均可接收數(shù)據(jù)。
3.多播(組播) :向指定的多播地址發(fā)送數(shù)據(jù),“訂閱”該地址的主機均可接收數(shù)據(jù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-521832.html

到了這里,關于UDP多播:一對多數(shù)據(jù)收發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關文章

  • java 發(fā)送和接收udp數(shù)據(jù) udp數(shù)據(jù)幀結構

    java 發(fā)送和接收udp數(shù)據(jù) udp數(shù)據(jù)幀結構

    項目開發(fā)中,有個需求是接收udp的組播信息,獲取幀并解析其中的內(nèi)容。之前沒有接觸過udp的通訊以及數(shù)據(jù)幀。查閱資料對udp的通訊間的發(fā)送與接收實現(xiàn)記錄如下。 UDP有三種通訊方式,分別是, 單播 、廣播、還有組播。 單播 : 單機與單機之間的通訊 廣播 : 當前主機與所在

    2024年02月02日
    瀏覽(23)
  • 網(wǎng)絡編程-UDP協(xié)議(發(fā)送數(shù)據(jù)和接收數(shù)據(jù))

    網(wǎng)絡編程-UDP協(xié)議(發(fā)送數(shù)據(jù)和接收數(shù)據(jù))

    需要了解TCP協(xié)議的,可以看往期文章 https://blog.csdn.net/weixin_43860634/article/details/133274701 通過此圖,可以了解UDP所在哪一層級中 發(fā)送數(shù)據(jù) 接收數(shù)據(jù) 運行效果 1、 UDP是面向無連接通信協(xié)議 (通俗一點講,就是不管是否已連接成功,直接發(fā)送數(shù)據(jù)),該特性正好與TCP協(xié)議相反,

    2024年02月07日
    瀏覽(27)
  • Linux 下 nc 發(fā)送接收 udp、tcp數(shù)據(jù)

    Linux 下 nc 發(fā)送接收 udp、tcp數(shù)據(jù)

    nc,全名叫 netcat,它可以用來完成很多的網(wǎng)絡功能,譬如端口掃描、建立TCP/UDP連接,數(shù)據(jù)傳輸、網(wǎng)絡調(diào)試等等,因此,它也常被稱為網(wǎng)絡工具的 瑞士軍刀 。 一、只服務端使用nc 備注:這種方式只能發(fā)送一次數(shù)據(jù),不能互相發(fā)送 1、udp發(fā)送接收數(shù)據(jù),udp本質(zhì)不區(qū)分客戶端服務

    2024年02月16日
    瀏覽(22)
  • STM32 LWIP UDP 一對一 一對多發(fā)送

    STM32 LWIP UDP 一對一 一對多發(fā)送

    之前沒有接觸過網(wǎng)絡的通信,工作需要 UDP 接收和發(fā)送通信,在網(wǎng)上沒有找到一對一、一對多的相關例程;于是在技術總監(jiān)對我的指導,用正點原子板子給的例程是從官方的程序修改的,實現(xiàn)了Lwip UDP通信一對一、一對多的發(fā)送程序,可以隨便指定發(fā)送 ip地址 、發(fā)送 端口號

    2024年02月15日
    瀏覽(59)
  • ESP32網(wǎng)絡開發(fā)實例-UDP數(shù)據(jù)發(fā)送與接收

    本文將詳細介紹在Arduino開發(fā)環(huán)境中,如何實現(xiàn)ESP32通過UDP協(xié)議進行數(shù)據(jù)發(fā)送與接收。 用戶數(shù)據(jù)報協(xié)議 (UDP) 是一種跨互聯(lián)網(wǎng)使用的通信協(xié)議,用于對時間敏感的傳輸,例如視頻播放或 DNS 查找。它通過在數(shù)據(jù)傳輸之前不正式建立連接來加速通信。這使得數(shù)據(jù)可以非??焖俚貍鬏?/p>

    2024年02月07日
    瀏覽(24)
  • 利用c++基于ffmpeg庫接收rtsp視頻數(shù)據(jù),并利用udp將以RTP協(xié)議將數(shù)據(jù)發(fā)送,同時利用udp接收RTP數(shù)據(jù)包,并基于ffmpeg庫播放視頻。

    這是兩個不同的任務,需要分別實現(xiàn)。 任務一:基于ffmpeg庫接收rtsp視頻數(shù)據(jù),并利用udp將以RTP協(xié)議將數(shù)據(jù)發(fā)送。 以下是基于ffmpeg庫接收rtsp視頻數(shù)據(jù),然后使用udp發(fā)送RTP協(xié)議數(shù)據(jù)的示例代碼: 任務二:利用c++利用udp接收RTP數(shù)據(jù)包,并基于ffmpeg庫播放視頻。 以下是利用c++利用

    2024年02月12日
    瀏覽(47)
  • Qt實現(xiàn)UDP發(fā)送與接收操作

    目錄 一、為什么要寫這篇文章,因為我就是要另辟蹊徑,當然也是汲取了網(wǎng)上大咖們的經(jīng)驗,盡量簡潔的進行總結 二、關于接收數(shù)據(jù)需的條件,需要綁定本地IP地址和端口號,可解釋為此時為服務器模式,遠端為客戶端模式,實現(xiàn)的代碼非常簡單幾行代碼可以搞定 三、數(shù)據(jù)

    2024年02月11日
    瀏覽(15)
  • Java netty發(fā)送接收(TCP、UDP)

    最下方附項目地址 項目地址 https://gitee.com/xn-mg/netty_kafka

    2024年02月16日
    瀏覽(20)
  • TCP/IP UDP廣播無法發(fā)送或接收

    在看《TCP/IP 網(wǎng)絡編程》這本書的時候,看到廣播那一節(jié),跟著書上寫代碼,怎么寫都不行,廣播就是沒法發(fā)送/接收,發(fā)送端一直在發(fā)送數(shù)據(jù),接收端就是沒有反應。 對了好幾遍源碼,沒有問題。實在是愁人。 最后查了很多資料,確定是網(wǎng)卡的問題。 現(xiàn)在的計算機都是多網(wǎng)

    2024年02月04日
    瀏覽(24)
  • QT網(wǎng)絡編程之實現(xiàn)UDP廣播發(fā)送和接收

    一.UDP廣播介紹 UDP廣播地址固定IP地址為:XXX.XXX.XXX.255。 如果向全網(wǎng)段發(fā)送廣播消息,那么廣播地址為:255.255.255.255; 如果向單個網(wǎng)段發(fā)送廣播消息,例如你的IP是192.168.31.104,那么廣播地址為192.168.31.255。 廣播消息接收方需要綁定0.0.0.0地址并監(jiān)聽指定端口即可收到廣播的群

    2024年03月25日
    瀏覽(50)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包