(二)UDP广播

来源:互联网 发布:淘宝如何卖东西 编辑:程序博客网 时间:2024/04/25 01:28
广播地址有两种:
一。受限广播地址: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);}}



0 0
原创粉丝点击