第21章 多播
时间:2022-05-03
本文章向大家介绍第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: %sn",
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
- shell 学习笔记(18)
- Hive 中的复合数据结构简介以及一些函数的用法说明
- BloomFilter 简介及在 Hadoop reduce side join 中的应用
- 关于 hadoop reduce 阶段遍历 Iterable 的 2 个“坑”
- Hadoop Mapper 阶段将数据直接从 HDFS 导入 Hbase
- 译文 | 量化投资教程:投资组合优化与R实践
- 浅谈 java 中构建可执行 jar 包的几种方式
- python 日志模块 logging 详解
- 基于堆实现的优先级队列:PriorityQueue 解决 Top K 问题
- explain 深入剖析 MySQL 索引及其性能优化指南
- 图文并茂详解 SQL JOIN
- 自定义 hadoop MapReduce InputFormat 切分输入文件
- Hadoop MapReduce 二次排序原理及其应用
- MySQL Tips【Updating】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python-科学计算-pandas-14-df按行按列进行转换
- Python实现扫码工具
- C++核心准则T.150:用static_assert检查类和概念的匹配性
- 初学者也能快速写Python脚本啦——通用功能代码分享
- C++核心准则CPL.1:C++比C更好
- C++核心准则CPL.2:如果你必须使用C,使用C和C++的共同子集,并且使用C++编译器编译C代码
- C++核心准则SF.1:如果你的项目没有正在遵从的其他习惯,为代码文件使用.cpp后缀,为接口文件使用.h后缀
- 群晖NAS搭建测速网站,支持万兆
- 二叉树:你真的会翻转二叉树么?
- C++核心准则SF.2:.h文件一定不能包含对象定义或者非inline函数定义
- Vue.js 源码⽬录设计
- 本周小结!(二叉树)
- extern "c"(2)
- Mysql 触发器基础
- C++核心准则SF.3:使用.h文件管理所有在多个源文件中使用的声明