一、广播的概念
广播(broadcast)是指封包在计算机网络中传输时,目的地址为网络中所有设备的一种传输方式。实际上,这里所说的“所有设备”也是限定在一个范围之中,称为“广播域”
二、组播的优点/特点
- 广播只能在一个广播域(局域网)中传播,而不能跨网段传播。发出的数据包,局域网的所有主机都能收到这个数据包
- 广播通信由UDP实现
- 路由器不转发广播数据包。交换机会转发广播数据包
- 并非所有的计算机网络都支持广播,例如X.25网络和帧中继都不支持广播,而且也没有在“整个互联网范围中”的广播。IPv6亦不支持广播,广播相应的功能由多播代替
- 通常,广播都是限制在局域网中的,比如以太网或令牌环网络。因为广播在局域网中造成的影响远比在广域网中小得多
三、广播的缺点
- 无法针对每个客户的要求和时间及时提供个性化服务。
- 网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。例如有线电视的客户端的线路支持100个频道(如果采用数字压缩技术,理论上可以提供500个频道),即使服务商有更大的财力配置更多的发送设备、改成光纤主干,也无法超过此极限。也就是说无法向众多客户提供更多样化、更加个性化的服务。
- 广播禁止在Internet宽带网上传输
四、广播的地址
- 广播的IP地址(Host ID全为1):例如192.168.43.255
- 广播的MAC地址:FF:FF:FF:FF:FF:FF
五、广播的实现
接收端
- 像普通的一个UDP接收端一样,绑定自己的地址准备接受信息即可
发送端
- 使用setsockopt函数对socket进行设置(将当前socket设置为一个广播socket,这样局域网其他人就可以接收到)
int yes=1; setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&yes,sizeof(yes));
六、案例
发送端
- 使用时提供一个IP和端口(要发送去哪里的IP和端口)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<errno.h>
#include<arpa/inet.h>
int main(int argc,char *argv[])
{
if(argc!=3){
printf("Please Enter %s [IP] [PORT]\n",argv[0]);
exit(EXIT_FAILURE);
}
//create socket
int sock=socket(AF_INET,SOCK_DGRAM,0);
if(sock<0){
perror("Create Sock Fila\n");
exit(EXIT_FAILURE);
}
else{
printf("Create Sock Success\n");
}
//setsockopt
int yes=1;
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&yes,sizeof(yes));
//set sendto who
struct sockaddr_in s_addr;
s_addr.sin_family=AF_INET;
s_addr.sin_port=htons(atoi(argv[2]));
s_addr.sin_addr.s_addr=inet_addr(argv[1]);
int addr_len=sizeof(s_addr);
char buf[128];
strcpy(buf,"I am a broadcast package\n");
//sendto
int len=sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&s_addr,addr_len);
if(len>0){
printf("Send Success\n");
}
else{
printf("Send Fail\n");
}
close(sock);
return 0;
}
接收端
- 使用时提供一个自己的端口即可
- 接收端不需要设置sock可选项,使用起来跟普通的UDP通信服务端一样为自己绑定一个地址用来接受广播信息即可
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<errno.h>
#include<arpa/inet.h>
int main(int argc,char *argv[])
{
if(argc!=2){
printf("Please Enter %s [PORT]\n",argv[0]);
exit(EXIT_FAILURE);
}
//create socket
int sock=socket(AF_INET,SOCK_DGRAM,0);
if(sock<0){
perror("Create Sock Fail\n");
exit(EXIT_FAILURE);
}
else{
printf("Create Sock Success\n");
}
struct sockaddr_in local;
local.sin_family=AF_INET;
local.sin_port=htons(atoi(argv[1]));
local.sin_addr.s_addr=INADDR_ANY;
//bind address
if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0){
perror("Bind Fila\n");
close(sock);
exit(EXIT_FAILURE);
}
else{
printf("Bind Success\n");
}
struct sockaddr_in peer;
char buf[128];
int len;
socklen_t addr_len=sizeof(peer);
while(1)//recvfrom message
{
len=recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&peer,&addr_len);
if(len>0){
buf[len]='\0';
printf("RecvMessage From %s/%d:%s",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port),buf);
}
else
{
perror("Recv Fila\n");
exit(EXIT_FAILURE);
}
}
close(sock);
return 0;
}
四、如何干掉HDCP(广播的应用之一)
- DHCP:自动分配IP地址协议
- 广播会去寻找局域网内的主机,如果找到主机就使用DHCP协议给这个主机分配一个IP地址。但是如果广播被占领了,DHCP就识别不到主机了,因此也就不能分配IP地址了