多播编程实例

服务器端

下面是一个多播服务器的例子。多播服务器的程序设计很简单,建立一个数据包套接字,选定多播的IP地址和端口,直接向此多播地址发送数据就可以了。多播服务器的程序设计,不需要服务器加入多播组,可以直接向某个多播组发送数据。

下面的例子持续向多播IP地址"224.0.0.100"的8888端口发送数据"BROADCAST TEST DATA",每发送一次间隔5s。

/*
*broadcast_server.c - 多播服务程序
*/
#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>
#include <stdlib.h>
#define MCAST_PORT 8888
#define MCAST_ADDR "224.0.0.100"    /*一个局部连接多播地址,路由器不进行转发*/
#define MCAST_DATA "BROADCAST TEST DATA"            /*多播发送的数据*/
#define MCAST_INTERVAL 5                            /*发送间隔时间*/
int main(int argc, char*argv)
{struct sockaddr_in mcast_addr;     int fd = socket(AF_INET, SOCK_DGRAM, 0);         /*建立套接字*/if (fd == -1){perror("socket()");exit(1);}memset(&mcast_addr, 0, sizeof(mcast_addr));/*初始化IP多播地址为0*/mcast_addr.sin_family = AF_INET;                /*设置协议族类行为AF*/mcast_addr.sin_addr.s_addr = inet_addr(MCAST_ADDR);/*设置多播IP地址*/mcast_addr.sin_port = htons(MCAST_PORT);        /*设置多播端口*//*向多播地址发送数据*/while(1) {int n = sendto(fd,MCAST_DATA,sizeof(MCAST_DATA),0,(struct sockaddr*)&mcast_addr,sizeof(mcast_addr)) ;if( n < 0){perror("sendto()");exit(1);}      sleep(MCAST_INTERVAL);                          /*等待一段时间*/}return 0;
}

客户端

多播组的IP地址为224.0.0.88,端口为8888,当客户端接收到多播的数据后将打印出来。

客户端只有在加入多播组后才能接受多播组的数据,因此多播客户端在接收多播组的数据之前需要先加入多播组,当接收完毕后要退出多播组。

/*
*broadcast_client.c - 多播的客户端
*/
#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>
#include <stdlib.h>
#define MCAST_PORT 8888
#define MCAST_ADDR "224.0.0.100"     /*一个局部连接多播地址,路由器不进行转发*/
#define MCAST_INTERVAL 5             /*发送间隔时间*/
#define BUFF_SIZE 256                /*接收缓冲区大小*/
int main(int argc, char*argv[])
{  struct sockaddr_in local_addr;              /*本地地址*/int fd = socket(AF_INET, SOCK_DGRAM, 0);     /*建立套接字*/if (fd == -1){perror("socket()");exit(1);}  int yes = 1;if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0)     {    perror("Reusing ADDR failed");    exit(1);    }/*初始化本地地址*/memset(&local_addr, 0, sizeof(local_addr));local_addr.sin_family = AF_INET;local_addr.sin_addr.s_addr = htonl(INADDR_ANY);local_addr.sin_port = htons(MCAST_PORT);/*绑定socket*/int err = bind(fd,(struct sockaddr*)&local_addr, sizeof(local_addr)) ;if(err < 0){perror("bind()");exit(1);}/*设置回环许可*/int loop = 1;err = setsockopt(fd,IPPROTO_IP, IP_MULTICAST_LOOP,&loop, sizeof(loop));if(err < 0){perror("setsockopt():IP_MULTICAST_LOOP");exit(1);}/*加入多播组*/struct ip_mreq mreq;                                    mreq.imr_multiaddr.s_addr = inet_addr(MCAST_ADDR); /*多播地址*/mreq.imr_interface.s_addr = htonl(INADDR_ANY); /*本地网络接口为默认*//*将本机加入多播组*/err = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof(mreq));if (err < 0){perror("setsockopt():IP_ADD_MEMBERSHIP");exit(1);}int times = 0;int addr_len = sizeof(local_addr);char buff[BUFF_SIZE];int n = 0;/*循环接收多播组的消息,5次后退出*/for(times = 0;times < 5;times++){memset(buff, 0, BUFF_SIZE);                 /*清空接收缓冲区*//*接收数据*/n = recvfrom(fd, buff, BUFF_SIZE, 0,(struct sockaddr*)&local_addr,&addr_len);if( n== -1){perror("recvfrom()");}/*打印信息*/printf("Recv %dst message from server:%s\n", times, buff);sleep(MCAST_INTERVAL);}/*退出多播组*/err = setsockopt(fd, IPPROTO_IP, IP_DROP_MEMBERSHIP,&mreq, sizeof(mreq));close(fd);return 0;
}

转载于:https://www.cnblogs.com/wangfengju/p/6172357.html

linux网络编程之二-----多播(组播)编程相关推荐

  1. Java网络编程(八)—— 组播和MulticastSocket

    Java网络编程(八)-- 组播和MulticastSocket 文章目录 Java网络编程(八)-- 组播和MulticastSocket 什么是组播 MulticastSocket类 总述 构造方 ...

  2. Qt网络编程-简易版UDP组播通信入门Demo(5)

    Qt网络编程-简易版UDP组播通信入门Demo(5)

  3. android multicast(组播)发送端和接收端源代码,android multicast 多播(组播)问题

    有谁遇到过同样问题的可以探讨下,或者已经解决问题的,能够指导下我 获取组播锁 private  InetAddress   group; WifiManager  wm=(WifiManager)ge ...

  4. 单播、广播、多播(组播)的概念和区别

    单播.广播.多播(组播)的概念和区别 简单理解如下: 1.一台机器和一台机器通信这是单播. 2.一台机器发出的数据包能被多台机器收到这就叫组播. 一个机器发送,多台机器接收,但是又不同于广播, 发送端 ...

  5. 网络直播,如何跳出组播的坑!

    互联网上的直播,其数据传输方式都采用"单播"方式,所以大家在讨论直播技术时,少有人提及"组播"这个词. 然而,作为直播的组成部分,在广电有线电视.IPTV等应用 ...

  6. 【Socket网络编程】5.单播、多播(组播)、广播

    [单播].[多播(组播)].[广播] https://blog.csdn.net/daaikuaichuan/article/details/83474089 ####[单播] 用于两个主机之间的端对 ...

  7. linux添加组播路由命令,linux – 使用ip route add将组播路由添加到多个接口

    TLDR:有没有办法使用"ip route"为多个网卡添加组播路由? 我们的软件使用两个多播组与两个不同的物理网络上的两个不同的设备组进行通信.除此应用程序外,一个网络上的设备无需 ...

  8. 组播 收发_[HCIARoutingamp;Switching]网络篇单播广播和组播

    组播是什么 传统的IP通信有两种方式:一种是在源主机与目的主机之间点对点的通信,即单播:另一种是在源主机与同一网段中所有其它主机之间点对多点的通信,即广播. 如果要将信息发送给多个主机而非所有主机,若 ...

  9. C语言使用多播/组播IP_ADD_MEMBERSHIP出现Invalid argument错误解决方法

    UDP练习遇到的问题 (1)在组播/多播开发练习过程中,使用setsockopt函数来添加多播组的时候,调用完成后返回值一直为-1.返回-1后,使用perror打印出错的原因.打印结果如下: **se ...

最新文章

  1. 如何识别和避免间谍软件
  2. 计算机通过路由器连接打印机共享的打印机,如何利用无线路由器进行打印机共享访问操作...
  3. 2013年的技术发展趋势
  4. 博客作业2---线性表
  5. DWORD dwSendTime =::GetTickCount();
  6. Java虚拟机垃圾收集器初步学习
  7. 全面快速准确地检索医学文献信息的策略
  8. hdu 2871 Memory Control(线段树)
  9. BenchmarkDotNet性能测试
  10. 2021牛客OI赛前集训营-提高组(第五场)D-牛牛的border【SAM】
  11. Oracle 关于事物的描述
  12. 【数学建模】day02-整数规划
  13. python实现mini-batch_Mini-Batch 、Momentum、Adam算法的实现
  14. Python爬虫 ---(1)爬虫基础知识
  15. BurpSuite使用——HTTP
  16. matlab简单分析频域滤波和时域滤波
  17. 记一次代码被公司电脑加密后,编译不通过
  18. 一键分析你的上网行为, 看看你平时上网都在干嘛?
  19. matlab按图像边缘抠图_PS抠图教程_PS抠图方法大全
  20. swiper滑动切换变换样式,实时显示当前索引

热门文章

  1. DLL回调EXE里的函数
  2. 编译FileMon出错
  3. POJ 1742 Coins
  4. 数据库内部存储结构探索
  5. Ubuntu 16.04 下 Vim配置
  6. 数理统计-5.4 三大抽样分布
  7. [BUUCTF-pwn]——mrctf2020_easyoverflow
  8. android10热点验证身份,在 Android 上使用 Microsoft 进行身份验证
  9. 15.4.3 用于Generator的泛型方法
  10. valuestack,stackContext,ActionContext.之间的关系