第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
- 在WebKit中并行加载外部脚本译:
- 100行代码,搞定http监控框架
- 【腾讯反病毒实验室】深度剖析APT28最新作品
- [译]clearfix改良及overflow:hidden详解
- 深入解析CSS样式层叠权重值
- [译]CSS边框实现“无图化”设计
- 自适应的多列图文混排改进
- [译]Laravel 5.0 之运行环境及环境变量
- 90行代码,搞定日志监控框架
- Laravel Migrate 中的 Fresh 和 Refresh 命令
- 框架组件,究竟要不要自研?
- Nginx泛解析到子目录,自动判断有无public目录
- 撩妹必备,3行代码伪造出一个“好莱坞黑客”屏幕
- [译]Laravel 5.0 之事件调度程序 (定时任务)
- 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 数组属性和方法
- Android自定义View绘制四位数随机码
- Anroid四大组件service之本地服务的示例代码
- Android使用Activity实现简单的可输入对话框
- ANDROID BottomNavigationBar底部导航栏的实现示例
- Android实现时间倒计时功能
- Android开发基于Drawable实现圆角矩形的方法
- Android开发中滑动分页功能实例详解
- Android登录注册功能 数据库SQLite验证
- CMQ消费者报错,无法获取本机ip地址问题排查
- 腾讯云TKE-Metrics-Server案例: TKE中自建Metrics-Server问题
- (建议收藏)关于JS事件循环, 这一篇就够啦
- TensorFlow2 开发指南 | 02 回归问题之汽车燃油效率预测
- 腾讯云TKE-Ingress案例: TKE-Ingress与Nginx-Ingress共存
- 玩转Kotlin 彻底弄懂Lambda和高阶函数
- leetcode之仅仅反转字母