计算机网络学习笔记6-多播

Posted studying~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机网络学习笔记6-多播相关的知识,希望对你有一定的参考价值。

多播

数据的收发仅在同一分组中进行
多播的特点:
1、多播地址标示一组接口
2、多播可以用于广域网使用
在IPv4中,多播是可选的

多播地址:
IPv4的D类地址是多播地址,前面有提
十进制:224.0.0.1 ~ 239.255.255.254 任意一个IP地址 都代表一个多播组

多播地址向以太网MAC地址的映射

即前24位固定为01 00 5e
第25位固定为0
后23位由多播地址后23位映射

UDP多播工作过程:

总结:1、主机先加入多播组 2、往多播组发送数据

关于MAC硬件地址不完备过滤,IP地址完备软件过滤的解释


使用setsockopt设置套接字的选项 将自己加入多播组
关键代码:

	struct ip_mreq mreq;
	mreq.imr_multiaddr.s_addr = inet_addr("224.0.0.2");
	mreq.imr_interface.s_addr = htonl(INADDR_ANY);
	setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,sizeof(mreq));

案例:(只能将自己加入多播组)

#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <fcntl.h>
//将主机 加入到多播组 224.0.0.2  接受
int main()
{
	int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	
	//让sockfd有一个固定的IP端口
	struct sockaddr_in my_addr;
	bzero(&my_addr,sizeof(my_addr));
	my_addr.sin_family = AF_INET;
	my_addr.sin_port = htons(8000);
	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	bind(sockfd, (struct sockaddr *)&my_addr,sizeof(my_addr));
	
	//将192.168.0.111 加入到多播组 224.0.0.2中
	struct ip_mreq mreq;
	mreq.imr_multiaddr.s_addr = inet_addr("224.0.0.2");
	mreq.imr_interface.s_addr = htonl(INADDR_ANY);
	setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,sizeof(mreq));
	
	while(1)
	{
		unsigned char buf[1500]="";
		recvfrom(sockfd,buf,sizeof(buf), 0,NULL,NULL);
		printf("buf=%s\\n", buf);
	}
	
	close(sockfd);
	return 0;
}

以上是关于计算机网络学习笔记6-多播的主要内容,如果未能解决你的问题,请参考以下文章

TCP/IP详解学习笔记-广播和多播,IGMP协议

C#学习笔记9

TCP/IP详解学习笔记

学习笔记:python3,代码片段(2017)

OpenCV 学习笔记(颜色直方图计算 calcHist)

计算机网络 网络层(下)