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

網(wǎng)絡編程(三)—— UDP(單播、廣播、組播)

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

一、單播

  1. UDP協(xié)議的特點:

    1. 無連接 、不保證傳輸可靠(可能重復到達、失序、丟失、無字節(jié)流控制(數(shù)據(jù)傳輸快的會淹沒慢的))

    2. UDP傳輸
      udp單播和組播,嵌入式學習,網(wǎng)絡編程,網(wǎng)絡,udp,單片機

  2. UDP 服務端(接收端)的搭建流程
    udp單播和組播,嵌入式學習,網(wǎng)絡編程,網(wǎng)絡,udp,單片機

  3. UDP客戶端(發(fā)送端)的搭建流程

udp單播和組播,嵌入式學習,網(wǎng)絡編程,網(wǎng)絡,udp,單片機

  1. 通信流程

udp單播和組播,嵌入式學習,網(wǎng)絡編程,網(wǎng)絡,udp,單片機

  1. sendto 和 recvfrom

    1. 這兩個函數(shù)一般在使用UDP協(xié)議時使用

    2. sendto

         功能: sendto - send a message on a socket
         
         頭文件:
                #include <sys/socket.h>
         函數(shù)原型:
                ssize_t sendto(int socket, const void *message, size_t length,
                       int flags, const struct sockaddr *dest_addr,
                       socklen_t dest_len);
         參數(shù)說明:
             	int socket: 通信套接字
             	const void *message: 要發(fā)送的數(shù)據(jù)(消息)
             	size_t length:發(fā)送的長度
                      int flags:發(fā)送的方式: 默認 0
                  const struct sockaddr *dest_addr: 要發(fā)送的目標地址:(指定對方的ip等)
                       socklen_t dest_len: 大小
                      
         返回值:
                成功: 返回成功的字節(jié)數(shù)
                失?。?返回-1并設置errno 
  1. recvfrom
      功能: recvfrom - receive a message from a socket
      
      頭文件:
             #include <sys/socket.h>
      函數(shù)原型:
             ssize_t recvfrom(int socket, void *restrict buffer, size_t length,
                    int flags, struct sockaddr *restrict address,
                    socklen_t *restrict address_len);
      參數(shù)說明:
          	int socket: 通信套接字
          	void *restrict buffer: 接收保存數(shù)據(jù)(消息)
          	size_t length:發(fā)送的長度
                   int flags:發(fā)送的方式: 默認 0
               struct sockaddr *restrict address:對方的ip
                    socklen_t *restrict address_len: 地址長度
                   
      返回值:
             成功: 返回成功的字節(jié)數(shù)
             失?。?返回-1并設置errno 
      
  1. 單播就是普通版的UDP 服務器和客戶端

代碼示例

服務器端

/*===============================================
*   文件名稱:UdpServer.c
*   創(chuàng) 建 者:   
*   創(chuàng)建日期:
*   描    述:
================================================*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>


int main(int argc, char *argv[])
{ 
    /*
    if( argc < 3 )
    {
        puts("arg err");
        return -1;
    }
    */
    //創(chuàng)建套接字
    int sockfd = socket(AF_INET ,SOCK_DGRAM,0);
    if( -1 == sockfd )
    {
        perror("socket fail");
        return -1;
    }

    //準備需要發(fā)送數(shù)據(jù)的服務器ip和端口

    struct sockaddr_in  ser_addr = {
    .sin_family  =  AF_INET ,
    .sin_port    =  htons(8888),
    .sin_addr.s_addr = inet_addr("0")
    };

    //綁定
    int ret = bind(sockfd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
    if( -1 == ret )
    {
        perror("bind ");
        return -1 ;
    }
    //發(fā)送數(shù)據(jù)
    char buf[BUFSIZ] = {0};
    while(1)
    {
        memset(buf,0,BUFSIZ);
        ret = recvfrom(sockfd,buf,BUFSIZ,0,NULL,NULL);
        if( -1 == ret)
        {
            perror("recv");
            return -1;
        }
        // sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
        puts(buf);
    }

    close(sockfd);
    return 0;
} 

客戶端

/*===============================================
 *   文件名稱:UdpClient.c
 *   創(chuàng) 建 者: 
 *   創(chuàng)建日期:2023年08月25日
 *   描    述:
 ================================================*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>


int main(int argc, char *argv[])
{ 
   
    //創(chuàng)建套接字
    int sockfd = socket(AF_INET ,SOCK_DGRAM,0);
    if( -1 == sockfd )
    {
        perror("socket fail");
        return -1;
    }

    //準備需要發(fā)送數(shù)據(jù)的服務器ip和端口

    struct sockaddr_in  ser_addr = {
        .sin_family  =  AF_INET ,
        //.sin_port    =  htonl(atoi(argv[2])),
        .sin_port    =  htons(8888),
        //.sin_addr.s_addr = inet_addr(argv[1])
        .sin_addr.s_addr = inet_addr("192.168.18.196")
    };

    //發(fā)送數(shù)據(jù)
    char buf[BUFSIZ] = {0};
    char rbuf[BUFSIZ] = {0};
    while(1)
    {
        fgets(buf,sizeof(buf),stdin);
        int ret = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&ser_addr,sizeof(ser_addr));

        if( -1 == ret )
        {
            perror("sendto fail");
            return -1;
        }

        //recvfrom(sockfd,rbuf,BUFSIZ,0,NULL,NULL);
        //
        puts(buf);
    }

    close(sockfd);
    return 0;
} 

二、廣播

定義:給同一網(wǎng)段的所有主機 發(fā)送 數(shù)據(jù)

如何實現(xiàn):需要給發(fā)送端開啟 廣播權限,并且 發(fā)送的目標地址是 廣播地址


代碼示例
服務器端

/*===============================================
*   文件名稱:UdpServer.c
*   創(chuàng) 建 者:    
*   創(chuàng)建日期:
*   描    述:
================================================*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>


int main(int argc, char *argv[])
{ 
 
    //創(chuàng)建套接字
    int sockfd = socket(AF_INET ,SOCK_DGRAM,0);
    if( -1 == sockfd )
    {
        perror("socket fail");
        return -1;
    }

    //準備需要發(fā)送數(shù)據(jù)的服務器ip和端口

    struct sockaddr_in  ser_addr = {
    .sin_family  =  AF_INET ,
    .sin_port    =  htons(6666),
    .sin_addr.s_addr = inet_addr("0")
    };

    //綁定
    int ret = bind(sockfd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
    if( -1 == ret )
    {
        perror("bind ");
        return -1 ;
    }
    //發(fā)送數(shù)據(jù)
    char buf[BUFSIZ] = {0};
    while(1)
    {
        memset(buf,0,BUFSIZ);
        ret = recvfrom(sockfd,buf,BUFSIZ,0,NULL,NULL);
        if( -1 == ret)
        {
            perror("recv");
            return -1;
        }
        // sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
        puts(buf);
    }

    close(sockfd);
    return 0;
} 

客戶端
/*===============================================
 *   文件名稱:UdpClient.c
 *   創(chuàng) 建 者:   
 *   創(chuàng)建日期:
 *   描    述:
 ================================================*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>


int main(int argc, char *argv[])
{ 
   
    //創(chuàng)建套接字
    int sockfd = socket(AF_INET ,SOCK_DGRAM,0);
    if( -1 == sockfd )
    {
        perror("socket fail");
        return -1;
    }

    //準備需要發(fā)送數(shù)據(jù)的服務器ip和端口

    struct sockaddr_in  ser_addr = {
        .sin_family  =  AF_INET ,
        //.sin_port    =  htonl(atoi(argv[2])),
        .sin_port    =  htons(6666),
        //.sin_addr.s_addr = inet_addr(argv[1])
        .sin_addr.s_addr = inet_addr("192.168.18.255") //廣播地址 
    };

    //開播廣播權限
    int opt = 1 ;
   // setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));
   // 
    setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));

    //發(fā)送數(shù)據(jù)
    char buf[BUFSIZ] = {0};
    char rbuf[BUFSIZ] = {0};
    while(1)
    {
        fgets(buf,sizeof(buf),stdin);
        int ret = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&ser_addr,sizeof(ser_addr));

        if( -1 == ret )
        {
            perror("sendto fail");
            return -1;
        }

    }

    close(sockfd);
    return 0;
} 

三、組播(多播)

  1. 有選擇的接收 客戶端的數(shù)據(jù)
  2. 是在接收端加入多播組
組播在發(fā)送者和每一接收者之間實現(xiàn)點對多點網(wǎng)絡連接。如果一臺發(fā)送者同時給多個接收者傳輸相同的數(shù)據(jù),也只需
復制一份相同的數(shù)據(jù)包。它提高了數(shù)據(jù)傳送效率,減少了骨干網(wǎng)絡出現(xiàn)擁塞的可能性。組播解決了單播和廣播方式
效率低的問題。當網(wǎng)絡中的某些用戶需求特定信息時,組播源(即組播信息發(fā)送者)僅發(fā)送一次信息,組播路由器借助
組播路由協(xié)議為組播數(shù)據(jù)包建立樹型路由,被傳遞的信息在盡可能遠的分叉路口才開始復制和分發(fā)。

代碼示例(服務器端)文章來源地址http://www.zghlxwxcb.cn/news/detail-756167.html

/*===============================================
*   文件名稱:UdpServer.c
*   創(chuàng) 建 者:
*   創(chuàng)建日期:
*   描    述:
================================================*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>


int main(int argc, char *argv[])
{ 
    /*
    if( argc < 3 )
    {
        puts("arg err");
        return -1;
    }
    */
    //創(chuàng)建套接字
    int sockfd = socket(AF_INET ,SOCK_DGRAM,0);
    if( -1 == sockfd )
    {
        perror("socket fail");
        return -1;
    }

    //準備需要發(fā)送數(shù)據(jù)的服務器ip和端口

    struct sockaddr_in  ser_addr = {
    .sin_family  =  AF_INET ,
    .sin_port    =  htons(8888),
    .sin_addr.s_addr = inet_addr("0")
    };
        

    //組播
    struct ip_mreqn group = {
        .imr_multiaddr.s_addr = inet_addr("224.224.224.224"),//組播地址:224.0.0.1——239
        .imr_address.s_addr =htonl(INADDR_ANY)//綁定本機ip

    };

    //設置組播權限
    
    if( -1 == setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&group,sizeof(group)))
    {
        perror("setsocket");
        return -1;
    }




    //綁定
    int ret = bind(sockfd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
    if( -1 == ret )
    {
        perror("bind ");
        return -1 ;
    }
    //發(fā)送數(shù)據(jù)
    char buf[BUFSIZ] = {0};
    while(1)
    {
        memset(buf,0,BUFSIZ);
        ret = recvfrom(sockfd,buf,BUFSIZ,0,NULL,NULL);
        if( -1 == ret)
        {
            perror("recv");
            return -1;
        }
        // sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
        puts(buf);
    }

    close(sockfd);
    return 0;
} 

客戶端
#include <stdio.h>
#include <string.h>
 #include <sys/types.h>          /* See NOTES */  //man  socket
 #include <sys/socket.h>
 #include <sys/socket.h>    //  man 7 ip
 #include <netinet/in.h>
 #include <netinet/ip.h> /* superset of previous */
#include <sys/socket.h>  //man 3 inet_addr  
#include <netinet/in.h>
#include <arpa/inet.h>  //man 2 read 
#include <unistd.h>

#define SIZE 1024
#define SERV_IP "0"
#define SERV_PORT 6666

//UDP 客戶端
int main(int argc,const char *argv[])
{
    int connfd; 
    int ret; 
    //1. socket
    connfd = socket(AF_INET, SOCK_DGRAM, 0); // udp:SOCK_DGRAM 
    if(-1 == connfd)
    {
        perror("socket");
        return -1;
    }
    //2. 填充ip 要連接的目標 ip 和端口
    struct sockaddr_in dest_addr = {
      .sin_family     = AF_INET, 
        .sin_port     = htons(SERV_PORT), 
        .sin_addr.s_addr = inet_addr("127.0.0.1")
    };
    //4.通信
    char buf[SIZE] = {0}; 
    while(1)
    {
        fgets(buf,  sizeof(buf)-1, stdin); 
        if(0 == strncmp(buf, "quit",4))
        {
            break; 
        }
        sendto(connfd, buf, sizeof(buf), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr)); 
    }
    //關閉套接字
    
    close(connfd);
    return 0;

}

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

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

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

相關文章

  • Linux網(wǎng)絡編程系列之UDP廣播

    Linux網(wǎng)絡編程系列之UDP廣播

    ? ? ? ? 1、 Linux網(wǎng)絡編程系列之網(wǎng)絡編程基礎 ? ? ? ? 2、 Linux網(wǎng)絡編程系列之TCP協(xié)議編程 ? ? ? ? 3、 Linux網(wǎng)絡編程系列之UDP協(xié)議編程 ? ? ? ? 4、 Linux網(wǎng)絡編程系列之UDP廣播 ? ? ? ? 5、 Linux網(wǎng)絡編程系列之UDP組播 ? ? ? ? 6、 Linux網(wǎng)絡編程系列之服務器編程——阻塞IO模型

    2024年02月04日
    瀏覽(17)
  • Qt網(wǎng)絡編程 (udp廣播和接收例)

    Qt網(wǎng)絡編程 (udp廣播和接收例)

    使用兩個項目 1 sender 用來廣播\\\"hello world\\\"; 2 receiver 用來接收廣播信息 1 創(chuàng)建Qdialog類 2 在sender.pro 中添加 QT +=network 一行代碼 3 在sender.h 中聲明類 class QUdpSocket; 在聲明一個私有對象 QUdpSocket *sender; 4 在ui界面拖入一個按鈕 用來觸發(fā)廣播信息 其槽函數(shù)如下 在sender.cpp 構造函數(shù)中添

    2024年02月11日
    瀏覽(19)
  • 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)
  • 【嵌入式-網(wǎng)絡編程】vmware中使用UDP廣播失敗問題

    問題描述: 自己在vmware中搭建了2臺虛擬機,虛擬機A向虛擬機A和虛擬機B發(fā)送廣播信息,接收端在虛擬機A和虛擬機B,這個時候,由于沒配置 sin.sin_addr.s_addr = htonl(INADDR_ANY); ,而是配置的 inet_pton(AF_INET, SERV_IP, sin.sin_addr.s_addr); ,導致虛擬機A的廣播信號發(fā)出去了,但是虛擬機B和

    2024年01月23日
    瀏覽(25)
  • udp多點通信-廣播-組播

    udp多點通信-廣播-組播

    單播 每次只有兩個實體相互通信,發(fā)送端和接收端都是唯一確定的。 主機之間的一對多的通信 所有的主機都可以接收到廣播消息(不管你是否需要) 廣播禁止穿過路由器(只能做局域網(wǎng)通信) 只有UDP可以廣播 廣播地址?有效網(wǎng)絡號+全是1的主機號 192.168.50.123?-----》?192.168.5

    2024年02月05日
    瀏覽(17)
  • 網(wǎng)絡編程——UDP編程

    網(wǎng)絡編程——UDP編程

    在C語言中進行UDP編程的一般步驟如下: (1) 包含頭文件 : 在代碼中包含必要的頭文件,以便使用UDP編程所需的函數(shù)和數(shù)據(jù)類型。通常情況下,你需要包含 sys/socket.h、netinet/in.h 和 arpa/inet.h。 (2) 創(chuàng)建套接字 : 使用 socket() 函數(shù)創(chuàng)建一個套接字,該套接字將用于網(wǎng)絡通信

    2024年02月05日
    瀏覽(22)
  • infinispan~組播和廣播

    Infinispan 是一個基于分布式系統(tǒng)的內存數(shù)據(jù)存儲和緩存平臺,它的集群實現(xiàn)原理涉及到節(jié)點的發(fā)現(xiàn)和通信。在 Infinispan 中,集群是由多個節(jié)點組成的,每個節(jié)點都存儲著數(shù)據(jù)的一部分,并且通過通信來保持數(shù)據(jù)的一致性和可用性。 Infinispan 集群的實現(xiàn)原理主要包括以下幾個關

    2024年02月12日
    瀏覽(17)
  • 單播,廣播,組播

    單播,廣播,組播

    只有一個源點網(wǎng)絡和一個終點網(wǎng)絡。源點網(wǎng)絡和終點網(wǎng)絡的關系是一對一的。數(shù)據(jù)報途徑的每一個路由器都要將這個分組僅從一個接口轉發(fā)出去。 單播是主機間一對一的通訊模式,網(wǎng)絡中的設備根據(jù)網(wǎng)絡報文中包含的目的地址選擇傳輸路徑,將單播報文傳送到指定的目的地,

    2023年04月08日
    瀏覽(22)
  • Linux網(wǎng)絡編程——UDP編程

    Linux網(wǎng)絡編程——UDP編程

    1、UDP通信協(xié)議,服務器端和客戶端無需建立連接,只需要知道對方套接字的地址信息就可以發(fā)送數(shù)據(jù) 2、UDP通信流程圖: 功能:創(chuàng)建套接字并返回套接字描述符 功能:將套接字與IP地址和端口號綁定 功能:發(fā)送數(shù)據(jù) 功能:接收數(shù)據(jù) 功能:關閉套接字 1、代碼功能:兩個進程

    2023年04月19日
    瀏覽(24)
  • 網(wǎng)絡編程 p5 UDP編程

    網(wǎng)絡編程 p5 UDP編程

    基本介紹 類DatagramSocket和DatagramPacket實現(xiàn)了基于UDP協(xié)議網(wǎng)絡程序。 UDP數(shù)據(jù)報通過數(shù)據(jù)報套接字DatagramSocket發(fā)送和接收,系統(tǒng)不保證UDP數(shù)據(jù)報一定能夠安全送到目的地,也不能確定什么時候可以抵達。 DatagramPacket對象封裝了UDP數(shù)據(jù)報, 在數(shù)據(jù)報中包含了發(fā)送端的IP地址和端口號

    2024年02月16日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包