UDP组播技术_udp组播只有一台 能收到-程序员宅基地

技术标签: C语言学习之路  udp  通信  socket  

UDP组播技术

一、    组播介绍

组播通信区别于单播与广播,有效的解决了单播与广播存在的低效率与高限制问题。信息源只需要发送一次信息,在同一组播组中的每个成员就能接收到该信息。具体理论参照百度百科等相关资料,下面主要通过Linux 进行组播实现。

二、     组播实现

1、向组播组发送消息(Send)

/*************************************************************************

       > FileName: MulticastSend.cpp

       > Author: chinanier

       > Mail: [email protected]

       > CreatedTime: 11/24 23:10:54 2014

 ************************************************************************/

 

#include <stdlib.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <time.h>

#include <string.h>

#include <stdio.h>

#include <unistd.h>

 

#define HELLO_PORT 12345

#define HELLO_GROUP "225.0.0.37"

 

int main(int argc,char *argv[])

{

    struct sockaddr_in addr;

    int fd, cnt;

    struct ip_mreq mreq;

    char *message="Hello, World!";

   

    /* create what looks like an ordinary UDPsocket */

    if ((fd=socket(AF_INET,SOCK_DGRAM,0)) <0)

    {

        perror("socket");

        exit(1);

    }

   

    /* set up destination address */

    memset(&addr,0,sizeof(addr));

    addr.sin_family=AF_INET;

   addr.sin_addr.s_addr=inet_addr(HELLO_GROUP);

    addr.sin_port=htons(HELLO_PORT);

   

    /* now just sendto() our destination! */

    while (1)

    {

        if (sendto(fd,message,strlen(message),0, (struct sockaddr *) &addr,sizeof(addr)) <0)

        {

            perror("sendto");

            exit(1);

        }

        sleep(1);

    }

}

 

2、向组播组接收消息(Recv)

/*************************************************************************

       > FileName: Multicastrecv.cpp

       > Author: chinanier

       > Mail: [email protected]

       > CreatedTime: 11/24 21:35:08 2014

 ************************************************************************/

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <unistd.h>

#include <time.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <netinet/in.h>

 

#define HELLO_PORT  12345

#define HELLO_GROUP "225.0.0.37"

#define MSGBUFSIZE 256

int main(int argc,char ** argv)

{

       /* create udp socket */

    struct sockaddr_in net_addr;

    struct ip_mreq merq;

    int nbytes =0;

    int addrlen =0;

    char msgbuf[512];

    int fd =0;

    u_int yes = 1;

    fd = socket(AF_INET,SOCK_DGRAM,0);

    if (fd<=0) {

        printf("socket() ");

        perror("");

        exit(1);

    }

    /* allow multiple sockets to use the samePORT number */

    if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) <0) {

        perror("Reusing ADDRfailed");

        exit(1);

    }

    /* set up destination address */

    memset(&net_addr,0,sizeof(net_addr));

    net_addr.sin_family      = AF_INET;

    net_addr.sin_addr.s_addr =htonl(INADDR_ANY);

    net_addr.sin_port        = htons(HELLO_PORT);

   

    /* bind to receive address */

    if (bind(fd,(struct sockaddr*)&net_addr,sizeof(net_addr)) < 0) {

        perror("bind()");

        exit(1);

    }

    /* get bind result */

    memset(&net_addr,0,sizeof(net_addr));

    addrlen = sizeof(net_addr);

    if ((getsockname(fd,(struct sockaddr*)&net_addr,(socklen_t*)&addrlen))<0) {

        perror("getsockname()");

        exit(1);

    }

    printf("bind port as%u\r\n",ntohs(net_addr.sin_port));

    /* use setsockopt() to request that thekernel join a multicast group */

    merq.imr_multiaddr.s_addr =inet_addr(HELLO_GROUP);

    merq.imr_interface.s_addr =htonl(INADDR_ANY);

    if(setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&merq,sizeof(merq)) <0) {

        perror("setsockopt()");

        exit(1);

    }

    /* now just enter a read-print loop */

    while (1) {

        addrlen = sizeof(net_addr);

        if ((nbytes =recvfrom(fd,msgbuf,MSGBUFSIZE,0,(struct sockaddr*)&net_addr,

                              (socklen_t*)&addrlen)) <0) {

            perror("recvfrom()");

            exit(1);

        }

        puts(msgbuf);

    }

    return0;

}

 

 

在Linux下编译执行,可得到结果。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chinanier/article/details/41686721

智能推荐

Xdebug安装与使用_xdebug 验证脚本的目标目录不是 public。-程序员宅基地

文章浏览阅读1.1k次。Xdebug安装与使用为什么需要Debugger?很多PHP程序员调试使用echo、print_r()、var_dump()、printf()等,其实对 于有较丰富开发经验的程序员来说这些也已经足够了,他们往往可以在程序执行的过程中,通过输出特定变量的值可以判断程序执行是否正确,甚至效率高低也可以 看出来(当然可能还需要使用一些时间函数)。那么我们为什么还需要一个专门的_xdebug 验证脚本的目标目录不是 public。

Java配合Tabula框架实现上传并解析PDF表格_java tabula-程序员宅基地

文章浏览阅读1.5k次,点赞3次,收藏6次。功能:解析上传的pdf表格,并存入数据库最近有个需求,功能如上。百度了一下主要推荐的框架有两个。一个是Itext,听说很厉害,但是商业使用需要花钱就没有太多了解。另一个是PdfBox,简单的写了个demo,可以获取到pdf内的所有文字并返回String。返回的数据位置会错乱,且api没有中文版,例子也不多,使用起来很麻烦(是我太菜)。在之后发现了Tabula,功能实现的很强大,就搜了搜看有没有给Java调用的方法,就找到了下边的贴子:https://blog.csdn.net/qq_3695600_java tabula

使用VsCode打造C#开发IDE_vscode 做c#开发-程序员宅基地

文章浏览阅读6.6k次,点赞3次,收藏25次。用VsCode写了几天Java,还是比较满意的,无论是在智能提示方面,还是在调试跳转文本编辑等方面,个人感觉都不次于IDEA等正牌重型IDE,所以就想顺带用VsCode把VisualStudio也替代了,但是还是发现有点儿小问题,就是必须严格的按照VsCode的新建步骤来,否则运行调试时会报错误。下面就详细分享一下用VsCode开发C#的步骤。_vscode 做c#开发

mysql-数据库字段date datetime timestamp与实体类类型对应关系_数据库的时间与实体类型的关系-程序员宅基地

文章浏览阅读8k次,点赞12次,收藏36次。https://www.cnblogs.com/lrzr/archive/2017/08/07/7299211.htmlhttps://blog.csdn.net/weixin_38336276/article/details/83892408https://www.cnblogs.com/1130136248wlxk/articles/5238538.html_数据库的时间与实体类型的关系

VUE{{}}中数据渲染出现undefined_vue undefined-程序员宅基地

文章浏览阅读2.5k次。VUE{{}}中数据渲染出现undefinedBackground在前端编码过程中,常常会出现在mustache表达式 {{}} 中undefine的某属性报错。原因是如果 {{}} 仅仅是个变量如 {{a}} 是不会报错的,a可以是undefine或者null。但是如果{{a.b}} 或者 {{a['b']}} ,那么当a是undefine的时候就会报错。并且因为Ajax是异步加载所以常常出现加载数据之前报出这个错误。Solution利用在标签上面添加v-if:例如: <div v-if_vue undefined

设计模式课程-高琪-专题视频课程-程序员宅基地

文章浏览阅读254次。设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结!_设计模式 高琪

随便推点

POJ 2746 约瑟夫问题_poj2746-程序员宅基地

文章浏览阅读525次。题目总时间限制: 1000ms 内存限制: 65536kB 描述 约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。输入 每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <_poj2746

如何为微信小程序添加定位导航和地图标注功能_小程序地图导航-程序员宅基地

文章浏览阅读1.3k次。在JavaScript代码中,我们需要将获取到的用户位置信息设置为map组件的latitude和longitude属性,并创建一个标注点并设置在markers属性中。在获取到用户的地理位置信息后,我们需要将用户的位置在地图上进行标注。在JavaScript代码中,我们需要在数据中添加路线规划相关信息,并在路线规划成功的回调函数中更新数据。同样的,我们在实现地图标注功能时,也需要获取用户的地理位置信息。至此,我们已经成功地实现了获取用户地理位置信息并在地图上标注出用户位置的功能。二、地图标注功能的实现。_小程序地图导航

DML DDL DCL TCL_dml is used to: 数据操纵语言用于: a. add /modify/delete da-程序员宅基地

文章浏览阅读288次。接着上篇说起,数据库操作语句,看了网上说的,有很多种说法,我现在总结的为DML DDL DCL TCL.DML (Data Manipulation Language)数据操纵语言statements are used for managing data within schema objects.由DBMS提供,用于让用户或程序员使用,实现对数据库中数据的操作。DML分成交互型DML和_dml is used to: 数据操纵语言用于: a. add /modify/delete data in the table b.

Hive安装及启动异常解决_启动hive session id一直-程序员宅基地

文章浏览阅读5.8k次,点赞4次,收藏19次。前期准备1、关于Hive的安装包和文档可以从这里获取:Hive官方文档Hive下载地址Hive源码地址2、Hive依赖于Hadoop,关于Hadoop的安装可以查看这里:Hadoop安装——启动模式,基本配置,启动方式Hadoop集群搭建——环境配置3、安装mysql由于Hive需要在数据库中存储元数据信息,所以安装hive之前需要先安装mysql。hive有一个默认的存放在内存中的数据库,企业开发_启动hive session id一直

在Qt designer中实现按钮的圆角设置_qt designer border-radius:10px;-程序员宅基地

文章浏览阅读9.2k次,点赞12次,收藏40次。放入按钮按键,在StyleSheet中设置:QPushButton{background-color: rgb(170, 170, 255);#背景颜色 color: white; #字体颜色 border-radius: 10px; border: 2px groove gray;#圆角设置 border-style: outset;#..._qt designer border-radius:10px;

ssh远程连接出现 Permission denied, please try again问题_permission denied, please try again.-程序员宅基地

ssh远程连接出现Permission denied问题的解决方法是:检查是否安装了SSH服务,如果已安装,需要打开配置文件并将PermitRootLogin设置为yes,然后重启SSH服务。

推荐文章

热门文章

相关标签