计算机网络学习笔记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-多播的主要内容,如果未能解决你的问题,请参考以下文章