一、广播的概念
广播(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地址了