广播地址有两种:
一。受限广播地址:255.255.255.255,但不能通过路由器,只能被当前子网的主机收到
二。直接广播
如:192.168.1.255 表示网段在 192.168.1.x 的主机都能收到,而且直接广播能通过路由器,例如,192.168.1.100的主机能发送广播给 192.168.2.x 的所有主机
但路由器一般默认是也是禁止直接广播的,但可以设置位不阻止
UDP广播的特点:
处于同一子网的主机收到广播后,必须处理,udp广播数据会顺着协议栈一直到 UDP 层,若端口号不匹配,才会被丢弃。所以用UDP传播的数据,如音频视频等高速率的应用,会带来较大负荷
注意:
1.只有UDP才有广播,TCP没有广播。
2.要实现广播很重要的一点时调用setsockopt()函数来把udp套接字设置成广播属性: setsockopt(udpsockfd,SOL_SOCK,SO_BROADCAST,&opt,sizeof(opt));
对于UDP广播这里没有什么服务端,客户端可言,一个代码就够了,你打开多个下面的代码,就可以验证广播是否成功。
#include"myhead.h"
char wbuf[50];
char rbuf[50];
struct udp_args
{
int udp;
struct sockaddr_in raddr;
};
void* thread(void* args)
{
char rbuf[50]={0};
struct udp_args s = *((struct udp_args*)args);
int udp = s.udp;
struct sockaddr_in raddr = s.raddr;
int len =sizeof(struct sockaddr);
while(1)
{
recvfrom(udp,rbuf,50,0,(struct sockaddr*)&raddr,
&len);
printf("%s\n",rbuf);
bzero(rbuf,50);
}
}
int main()
{
struct udp_args udp_a;
int udp,size,opt=1;
struct sockaddr_in daddr;
struct sockaddr_in raddr;
pthread_t tid;
raddr.sin_family = AF_INET;
raddr.sin_port = htons(8888);
raddr.sin_addr.s_addr =htonl(INADDR_ANY);
daddr.sin_family = AF_INET;
daddr.sin_port = htons(8888);
daddr.sin_addr.s_addr = inet_addr("192.168.152.255");
udp = socket(AF_INET,SOCK_DGRAM,0);
setsockopt(udp,SOL_SOCKET,SO_BROADCAST,&opt,sizeof opt);
setsockopt(udp,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof opt);
bind(udp,(struct sockaddr*)&raddr,sizeof(struct sockaddr));
udp_a.udp = udp;
udp_a.raddr = raddr;
pthread_create(&tid,NULL,thread,(void*)&udp_a);
int len = sizeof(struct sockaddr);
while(1)
{
scanf("%s",wbuf);
sendto(udp,wbuf,strlen(wbuf),0,
(struct sockaddr*)&daddr,len);
bzero(wbuf,50);
}
}