(二)UDP广播

广播地址有两种:
一。受限广播地址: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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值