一、广播
广播:由一台主机向该主机所在子网内的所有主机发送数据的方式。 广播只能用UDP或原始IP实现,不能用TCP。 广播的MAC地址:ff.ff.ff.ff.ff.ff
二、广播的用途
单个服务器与多个服务器主机通信时减少分组流通。 以下几个协议都用到广播:
①地址解析协议(ARP) 通过IP,获取对方的MAC地址
②动态主机配置协议(DHCP) 自动获取主机IP
③网络时间协议(NTF) 获取当前时间
三、UDP广播的特点
①处于同一子网的所有主机必须处理数据。 ②UDP数据包会沿协议向上一直到UDP层。 ③运行音视频等较高速率工作的应用,会带来很大的负担。 ④局限于局域网使用。
四、UDP广播地址
{网络ID,主机ID} 网络ID:表示由子网掩码中1覆盖的连续位。 主机ID:表示由子网掩码中0覆盖的连续位。 定向广播地址:主机ID全为1 eg:对于192.168.220.0/24,其定向广播为192.168.220.255 通常路由不转发该广播 受限广播地址:255.255.255.255(此地址全世界都会处理) 路由器不转发该广播
注意:若指向在某一局域网内广播,选择定向广播。若想在任何局域网内广播,只能选择受限广播。
五、案例
socket套接字默认不支持广播,需使用setsockopt(套接字选型)
int setsockopt(int sockfd, int level,int optname,const void *optval,socklen_t optlen);
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netint/in.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <fcntl.h>
int main()
{
int sockfd = socket(AF,INET,SOCK_DGRAM,0);
int yes=1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));
char message[]="hello,I'm broadcast";
struct sockaddr_in dst_addr;
bzero(&dst_addr,sizeof(dst_addr));
dst_addr.sin_family = AF_INET;
dst_addr.sin_port = htons(8000);
dst_addr.sin_addr = inet_addr("255.255.255.255");
sendto(sockfd, message,strlen(message), (struct sockaddr *)&dst_addr, sizeof(dst,addr));
close(sockfd);
}
|