第21章 多播

1·多播(组播)地址:224.0.0.0~139.255.255.255

2·发送多播数据报无需任何特殊处理,发送应用程序不必为此加入多播组

3·多播相对于广播的优势在于不会对多播分组不感兴趣的主机增加额外负担

#include "../Gnet.h"

int main(int argc, const char* argv[])
{
    int sendfd, recvfd;
    const int on = 1;
    //const int off = 0;
    struct sockaddr_in sockaddr;
    socklen_t addrlen;
    struct ip_mreq mreq;
    int nrecv;
    char buf[MAX_LINE];
    char addrstr[INET_ADDRSTRLEN];

    if(argc != 2)
        perr_exit("usage: mcast <IP-multicast-address>");

    sendfd = Socket(AF_INET, SOCK_DGRAM, 0);
    recvfd = Socket(AF_INET, SOCK_DGRAM, 0);

    if(setsockopt(recvfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
        perr_exit("setsockopt error. 22");

    sockaddr.sin_family = AF_INET;
    //sockaddr.sin_port = htons(SERVER_PORT);
    if(inet_pton(AF_INET, argv[1], &sockaddr.sin_addr) < 0)
        perr_exit("inet_pton error.27");
    addrlen = sizeof(sockaddr);
    Bind(recvfd, (struct sockaddr*)&sockaddr, addrlen);//接收套接字绑定多播地址

    mreq.imr_multiaddr = sockaddr.sin_addr;
    //inet_pton(AF_INET, "192.168.17.129", &mreq.imr_interface.s_addr);
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);

    if(setsockopt(recvfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) <0)//接收套接字加入多播组
        perr_exit("setsockopt error.35");
    //setsockopt(sendfd, IPPROTO_IP, IP_MULTICAST_LOOP, &off, sizeof(off));
    if(fork() > 0)
    {
        while(1)
        {
            nrecv = recvfrom(recvfd, buf, MAX_LINE, 0, (struct sockaddr*)&sockaddr, &addrlen); 
            printf("from %s: %s\n", 
                   inet_ntop(AF_INET, &sockaddr, addrstr, sizeof(addrstr)), buf);
        }
    }
    else
    {
        while(1)
        {
            sendto(sendfd, "test data", strlen("test data")+1, 0, (struct sockaddr*)&sockaddr, addrlen);
            sleep(2);
        }
    }

    return 0;
}

github:https://github.com/gongluck/unp-notes

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • boost: atomic

    版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/...

    _gongluck
  • your project contains error(s),please fix them before running your application.错误总结

             Android开发中的问题总是多种多样,今天我来总结一个浪费了我一个晚上的错误T-T:your project contains error(...

    _gongluck
  • python笔记:#011#循环

    循环 目标 程序的三大流程 while 循环基本使用 break 和 continue while 循环嵌套 01. 程序的三大流程 在程序开发中,一共有三种流...

    _gongluck
  • WordPress5.5 自带默认 XML 站点地图 wp-sitemap.xml 移除教程

    WordPress5.5 版本新增了许多的功能,其中主要的新功能就是 WordPress 开始自带了 XML 站点地图(XML SiteMap),文件在根目录"...

    开心分享
  • Python:使用 Pylint 控制代码质量

    pylint.exe 的安装位置在Python目录下Scripts\pylint.exe,需添加环境变量 PATH

    弄啥嘞
  • 腾讯产品春招实习面经

    牛客网
  • HydroCMS水利设计管理系统,基于beego框架

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

    hotqin888
  • 全球首架“量子无人机”从南京大学起飞

    量子纠缠时,如果一个纠缠状态中的粒子被观测那么一定会导致这种纠缠态的坍塌,量子通信的安全就是使用了量子纠缠的这个特性实现的。

    大数据文摘
  • 9.JAVA-抽象类定义

    比如图形(Shape)类, 就是一个抽象的概念,因为我们无法计算这个“图形”的面积,所以它的成员函数area()是空的。

    张诺谦
  • 量子通信,怎样保障信息安全?

    日前,中国科学技术大学合肥微尺度物质科学国家实验室潘建伟院士、陆朝阳教授等完成的“多自由度量子隐形传态”名列2015年度国际物理学领域的十项重大突破榜首。 而北...

    新智元

扫码关注云+社区

领取腾讯云代金券