网络编程多播——Multicast
来源:互联网 发布:比特精灵软件下载 编辑:程序博客网 时间:2024/05/17 22:59
网络编程多播——Multicast
IP多播(也称多址广播或组播)技术,是一种允许一台或多台主机(多播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP网络技术。
通俗点讲,多播也称组播,大概可以理解为分组广播的意思,是介于单播和广播之间的一种通信机制,使用多播方式,可以实现对局域网内一组特定的主机进行通信,对局域网节点分组,加入该分组即可接收该分组的消息,而未加入分组则收不到消息。
多播编程步骤
1. 建立套接字接口 2. 设置套接字属性3. 加入特定的多播组4. 发送/接收信息5. 离开多播组6. 关闭套接字* 若只是发信息,可不用加入组,直接向该组发送信息即可
多播相关套接字选项
1. IP_MULTICASE_TTL 设置超时时间, 范围是0~2552. IP_MULTICAST_IF 指定使用的网络接口,如果主机有多个网络接口,不设置该选项则使用默认接口发送接收,使用该选项可指定某特定网络接口发送和接收信息3. IP_MULTICAST_LOOP 设置是否晕熏数据发送到本地loop地址4. IP_ADD_MEMBERSHIP/IP_DROP_MEMBERSHIP 加入/离开特定的多播组, 操作一个struct ip_mreq结构体,里面包含带加入/离开组的信息
多播编程客户端示例:
(只发送)
#define MULT_ADDR "224.0.0.250"#define MULT_PORT 9999#define MSG "multicast message"int main(){ int sock; struct sockaddr_in mult_addr; sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { return -1; } memset(&mult_addr, 0, sizeof(mult_addr)); mult_addr.sin_family = AF_INET; mult_addr.sin_port = htons(MULT_PORT); mult_addr.sin_addr.s_addr = inet_addr(MULT_ADDR); socklen_t l = sizeof(mult_addr); unsigned char ttl = 20; l = sizeof(ttl); setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (void *)&ttl, l); l = sizeof(mult_addr); while (1) { sendto(sock, MSG, sizeof(MSG), 0, (struct sockaddr *)&mult_addr, l); printf("SEND to : %s buf: %s\n", inet_ntoa(mult_addr.sin_addr), MSG); if (getchar() == 'q') { break; } } close(sock); return 0;}
多播编程服务端示例:
(只接收)
#define MULT_ADDR "224.0.0.250"#define MULT_PORT 9999int main(){ struct sockaddr_in addr; int sock; struct ip_mreq mreq; sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { printf("failed to create udp socket\n"); return -1; } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(MULT_PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(sock, (struct sockaddr *)&addr, sizeof(addr))) { printf("failed to bind socket\n"); close(sock); return -1; } memset(&mreq, 0, sizeof(mreq)); mreq.imr_multiaddr.s_addr = inet_addr(MULT_ADDR); mreq.imr_interface.s_addr = htonl(INADDR_ANY); char buf[64]; socklen_t l = sizeof(addr); if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { printf("failed to join multicast group\n"); close(sock); return -1; } while (1) { int n = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&addr, &l); if (n > 0) { printf("RECIVE from %s => buf: %s\n", inet_ntoa(addr.sin_addr), buf); } } setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)); close(sock); return 0;}
SOURCE CODE
阅读全文
0 0
- 网络编程多播——Multicast
- 网络基本概念之TCP, UDP, 单播(Unicast), 多播(组播)(Multicast)
- 网络基本概念之TCP, UDP, 单播(Unicast), 多播(组播)(Multicast)
- 网络基本概念之TCP, UDP, 单播(Unicast), 多播(组播)(Multicast)
- 网络基本概念之TCP, UDP, 单播(Unicast), 多播(组播)(Multicast)
- 网络基本概念之TCP, UDP, 单播(Unicast), 多播(组播)(Multicast)
- Linux网络编程——多播
- Linux网络编程——多播
- Linux网络编程——多播
- Linux网络编程——多播
- 多播收发程序multicast
- android multicast 多播(组播)问题
- 网络编程(0)--multicast
- Linux网络编程08——多播
- C#多播委托(Multicast Delegate)
- php multicast多播实现详解
- 【Linux网络编程】多播、组播
- C网络编程-多播
- mysql "ON DUPLICATE KEY UPDATE" 语法
- 内存池、进程池、线程池
- 新的博客
- JavaScriptDOM练习之事件绑定与解绑
- C++虚函数与虚函数表
- 网络编程多播——Multicast
- 小米4 android6.01的开发者模式开启方法
- 【机器学习 吴恩达】CS229课程笔记notes1翻译-Part II分类和logistic回归
- 1.2算法基本举例(下篇)
- [Gym-101201K]
- 单元测试
- Qt 中实现在控件中点击鼠标,就在鼠标点击处加载图片的方法
- 算法设计与分析笔记之(7):概率算法
- 数学趣事