精华内容
下载资源
问答
  • UDP组播

    2021-01-22 18:28:18
    UDP组播 UDP(UserDatagram Protocol) 中文名用户数据报协议,是OSI参考模型中一种无连接的传输层协议,是一种高效但不可靠传输。UDP在IP报文中的协议号是17。 UDP传递方式 UDP有三种传输方式:单播、广播、多播。 ...

    UDP组播

    UDP(UserDatagram Protocol)
    中文名用户数据报协议,是OSI参考模型中一种无连接的传输层协议,是一种高效但不可靠传输。UDP在IP报文中的协议号是17。

    UDP传递方式
    UDP有三种传输方式:单播、广播、多播。
    1.单播Unicast:客户端与服务器之间点对点连接。
    2.广播BroadCast:主机一对所有的通讯模式,广播者可以向网络中所有主机发送信息。广播禁止在Internet宽带网上传输。
    3.多播MultiCast:即组播。主机一对一组的通讯模式,只有加入了同一个组的主机才可以收到此组内的所有数据。

    组播地址
    1.地址范围:D类IP地址。范围:224.0.0.0~239.255.255.255
    2.组播组:永久/临时。永久组播组一般由官方分配。
    3.224.0.0.0~224.0.0.255为预留的组播地址,即永久组地址。地址224.0.0.0保留不做分配,其它地址供路由协议使用。
    4.224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet。
    5.224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效。
    6.239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。

    # 组播的原理
    用户申请组播组,且组播组被维护在路由器中,通过路由器向改组播组内的用户进行消息的转发。广域网通信,一般网络设备默认阻止组播协议通过。

    组播的基本步骤
    1.建立socket
    2.socket和端口绑定
    3.加入组播组(关键步骤)
    4.通过sendto/recvfrom进行数据收发
    5.关闭socket

    UDP应用
    包总量较少的通信
    视频、音频多媒体通信(即时通信)
    广播通信

    组播流程图
    在这里插入图片描述

    主要函数
    setsockopt设置套接字选项可以设置多播的一些相关信息
    IP_MULTICAST_TTL //设置多播的跳数值
    IP_ADD_MEMBERSHIP //将主机的指定接口加入多播组,以后就从这个指定的接口发送与接收数据
    IP_DROP_MEMBERSHIP //主机退出多播组
    IP_MULTICAST_IF //获取默认的接口或设置多播接口
    IP_MULTICAST_LOOP //设置或禁止多播数据回送,即多播的数据是否回送到本地回环接口 例子:
    int ttl = 255;
    setsockopt(socket, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,sizeof(ttl));
    //设置跳数 socket -套接字描述符 PROTO_IP -选项所在的协议层 IP_MULTICAST_TTL -选项名 &ttl -设置的内存缓冲区 sizeof(ttl) -设置的内存缓冲区长度

    C++代码实现
    1.关键代码加入组播组:

        struct ip_mreq mreq;    //组播结构体
        /* use setsockopt() to request that the kernel join a multicast group */    
        mreq.imr_multiaddr.s_addr=inet_addr(GROUP_IP);     //组播组的ip地址  
        mreq.imr_interface.s_addr=htonl(INADDR_ANY);       //加入的客户端主机的ip地址  INADDR_ANY为0.0.0.0,泛指本机,表示本机所有的ip.
    
        //客户端只有在加入多播组后才能接受多播组的数据
        if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&mreq,sizeof(mreq)) < 0)   
        {    
            return GetLastError();
        }    
    

    2.Demo后期再补

    展开全文
  • udp组播

    2017-04-26 14:34:56
    udp组播udp组播先说明组播与广播 C语言实现客户端与服务端udp组播传递信息 监听端 发送端 先说明组播与广播可以参考的资料 Dake423大神的UDP 组播 广播 wiki的解释简单说就是下面这一句 组播是一对多的传输方式,...

    udp组播

    记着一个就是组播使用D类地址

    先说明组播与广播

    可以参考的资料
    Dake423大神的UDP 组播 广播
    wiki的解释

    简单说就是下面这一句

    组播是一对多的传输方式,发送端将数据向一个组内发送,网络中的路由器通过底层的IGMP协议自动将数据发送到所有监听这个组的终端。
    至于广播则和组播有一些相似, 区别是路由器向子网内的每一个终端都投递一份数据包,不论这些终端是否乐于接收该数据包。

    C语言实现客户端与服务端udp组播传递信息

    监听端

    第一步 创建套接字

    int socklisten= socket(AF_INET,SOCK_DGRAM,0);

    第二步 设置地址结构体
    创建结构体包含监听端口的信息

    struct sockaddr_in recvaddr;
    recvaddr.sin_family=AF_INET;
    recvaddr.sin_port=htons(2425);
    recvaddr.sin_addr.s_addr=inet_addr("239.255.255.0");

    第三步 设置socket为组播

    SO_REUSEADDR 组播
    SO_BROADCAST 广播

    int sinsize=1;
    setsockopt(socklisten,SOL_SOCKET,SO_REUSEADDR,&sinsize,sizeof(int));

    第四步 绑定

    bind(socklisten,(struct sockaddr *)&recvaddr,sizeof(struct sockaddr));

    第五步 监听,读取对端内容

    recvfrom(socklisten,buf,20,0,(struct sockaddr *)&recvaddr,&addlen);

    发送端

    只有第五步不同

    sendto(udpsock,buf,strlen(buf),0,(struct sockaddr *)&baddr,sizeof(struct sockaddr));

    监听端

    对应的接收端也要进行监听组播的地址才能进行监听

    绑定地址

    自己IP(失败)
    组播地址(成功)
    INADDR_ANY(成功)

    //./udprecv 224.0.0.255
    // 接收端,服务器udp广播,接收端
    #include "myhead.h"
    
    int main(int argc,char **argv)
    {
        int udpsocket;
        int res;
        char buf[50];
        struct sockaddr_in saddr;
        struct sockaddr_in raddr;
        bzero(&saddr,sizeof(saddr));
        bzero(&raddr,sizeof(raddr));
        // 初始化地址结构体变量
        saddr.sin_family = AF_INET;
        saddr.sin_port = htons(5001);
        saddr.sin_addr.s_addr = htonl(INADDR_ANY); // 可以
        //绑定什么无非三种选择,自己?(不可以)  
        //绑定INADDR_ANY?(可以)
        //绑定组播地址?(可以)
        //saddr.sin_addr.s_addr = inet_addr("225.10.10.11"); //可以的
        //saddr.sin_addr.s_addr = inet_addr("192.168.3.105");  绑定自己的ip是不行的
        // 定义并初始化组播的结构体
        struct ip_mreq mreq;
        bzero(&mreq, sizeof mreq);
        mreq.imr_multiaddr.s_addr = inet_addr(argv[1]);  //组播地址,D类型
        mreq.imr_interface.s_addr = htonl(INADDR_ANY);
    
    
    
    
        // 创建udp套接字
        udpsocket = socket(AF_INET,SOCK_DGRAM,0);
        if(udpsocket == -1)
        {
            perror("create udp socket failed!\n");
            return -1;
        }
        // 设置可以组播
        setsockopt(udpsocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                    &mreq, sizeof mreq); 
        int ret = sizeof(struct sockaddr);
        // 绑定
        res = bind(udpsocket,(struct sockaddr *)&saddr,ret);
        if(res == -1)
        {
            perror("bind udp socket failed!\n");
            return -1;
        }
    
        while(1)
        {
            bzero(buf,50);
            recvfrom(udpsocket,buf,50,0,(struct sockaddr *)&raddr,&ret);
            printf("message recv from %s\n",buf);
        }
    
        close(udpsocket);
        return 0;
    
    }
    //./udpsend 224.0.0.255
    // 发送端,客户端udp广播,发送端
    #include "myhead.h"
    
    int main(int argc,char **argv)
    {
        int udpsocket;
        int res;
        char buf[50];
        struct sockaddr_in saddr;
    
        bzero(&saddr,sizeof(saddr));
    
        // 初始化地址结构体变量
        saddr.sin_family = AF_INET;
        saddr.sin_port = htons(5001);
        saddr.sin_addr.s_addr = inet_addr(argv[1]);
        // 必须是组播地址 D类地址
        //wiki上资料(也叫群播)
        //D类地址(群播)  1110    224.0.0.0到239.255.255.255
        //经典的极域教室就是组播
    
        // 创建udp套接字
        udpsocket = socket(AF_INET,SOCK_DGRAM,0);
        if(udpsocket == -1)
        {
            perror("create udp socket failed!\n");
            return -1;
        }
        // 将套接字的属性设置为可以广播
        int on = 1;
        setsockopt(udpsocket, SOL_SOCKET, SO_BROADCAST, &on, sizeof on);
        int ret = sizeof(struct sockaddr);
    
        while(1)
        {
            bzero(buf,50);
            printf("please input a message !\n");
            scanf("%s",buf);
            sendto(udpsocket,buf,50,0,(struct sockaddr *)&saddr,ret);
        }   
    
        close(udpsocket);
        return 0;
    
    }
    展开全文
  • UDP 组播

    2020-12-21 09:43:47
    server.cpp #include #include #include #include #include #include #include #include #include #include #define MCAST_PORT 8888 #define MCAST_ADDR "224.0.0.88" /*一个局部连接多地址,路由器不进行转发*/ ...

    server.cpp

    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<sys/types.h>
    #include<unistd.h>
    #include<sys/socket.h>
    #include<netdb.h>
    #include<arpa/inet.h>
    #include<netinet/in.h>
    #define MCAST_PORT 8888
    #define MCAST_ADDR "224.0.0.88" /*一个局部连接多播地址,路由器不进行转发*/
    #define MCAST_INTERVAL 5  //发送时间间隔
    #define BUFF_SIZE 256   //接收缓冲区大小
    using namespace std;
    int main()
    {
        int sock;
        struct sockaddr_in local_addr;
        int err=-1;
        sock=socket(AF_INET,SOCK_DGRAM,0);
        if(sock==-1)
        {
            cout<<"sock error"<<endl;
            return -1;
        }
        /*初始化地址*/
        local_addr.sin_family=AF_INET;
        local_addr.sin_addr.s_addr=htonl(INADDR_ANY);
        local_addr.sin_port=htons(MCAST_PORT);
        /*绑定socket*/
        err=bind(sock,(struct sockaddr*)&local_addr,sizeof(local_addr));
        if(err<0)
        {
            cout<<"bind error"<<endl;
            return -2;
        }
        /*设置回环许可*/
        int loop=1;
        err=setsockopt(sock,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop));
        if(err<0)
        {
            cout<<"set sock error"<<endl;
            return -3;
        }
        struct ip_mreq mreq;/*加入广播组*/
        mreq.imr_multiaddr.s_addr=inet_addr(MCAST_ADDR);//广播地址
        mreq.imr_interface.s_addr=htonl(INADDR_ANY); //网络接口为默认
        /*将本机加入广播组*/
        err=setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
        if(err<0)
        {
            cout<<"set sock error"<<endl;
            return -4;
        }
        int times=0;
        socklen_t addr_len=0;
        char buff[BUFF_SIZE];
        int n=0;
        /*循环接受广播组的消息,5次后退出*/
        for(times=0;;times++)
        {
            addr_len=sizeof(local_addr);
            memset(buff,0,BUFF_SIZE);
            n=recvfrom(sock,buff,BUFF_SIZE,0,(struct sockaddr*)&local_addr,&addr_len);
            if(n==-1)
            {
                cout<<"recv error"<<endl;
                return -5;
            }
            /*打印信息*/
            printf("RECV %dst message from server : %s\n",times,buff);
            sleep(MCAST_INTERVAL);
         }
        /*退出广播组*/
        err=setsockopt(sock,IPPROTO_IP,IP_DROP_MEMBERSHIP,&mreq,sizeof(mreq));
        close(sock);
        return 0;
    }
    
    

    client.cpp

    #include<iostream>
    #include<stdio.h>
    #include<sys/socket.h>
    #include<netdb.h>
    #include<sys/types.h>
    #include<arpa/inet.h>
    #include<netinet/in.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<string.h>
    #define MCAST_PORT 8888
    #define MCAST_ADDR "224.0.0.88"  // 多播地址
    #define MCAST_DATA "BROADCAST TEST DATA"  // 多播内容
    #define MCAST_INTERVAL 5  //多播时间间隔
    using namespace std;
    
    int main()
    {
        int sock;
        struct sockaddr_in mcast_addr;
        sock=socket(AF_INET,SOCK_DGRAM,0);
        if(sock==-1)
        {
             cout<<"socket error"<<endl;
             return -1;
        }
        memset(&mcast_addr,0,sizeof(mcast_addr));
        mcast_addr.sin_family=AF_INET;
        mcast_addr.sin_addr.s_addr=inet_addr(MCAST_ADDR);
        mcast_addr.sin_port=htons(MCAST_PORT);
        while(1)
        {   
        	//向局部多播地址发送多播内容
            int n=sendto(sock,MCAST_DATA,sizeof(MCAST_DATA),0,(struct sockaddr*)&mcast_addr,sizeof(mcast_addr));
            if(n<0)
            {
                cout<<"send error"<<endl;
                return -2;
            }
            else
            {
                cout<<"send message is going ...."<<endl;
            }
            sleep(MCAST_INTERVAL);
    
        }
        return 0;
    }
    
    
    展开全文
  • UDP广播 UDP组播模块源码,支持UDP广播、UDP组播
  • Aeron.NET - 高效可靠的UDP单播, UDP组播和IPC消息传输 - Aeron的.NET移植

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,345
精华内容 938
关键字:

udp组播