UDP广播

理论上可以像播放电视节目一样在整个Internet 上发送广播数据,但是几乎没有路由器转发广播数据,所以,广播程序只能应用在本地子网中。
广播需要有发送方和接收方,必须有一些线程在机器上监听到来的数据。广播的缺点是如果有多个进程都发送广播数据,网络就会阻塞,网络性能便会受到影响。
广播发送方:使用setsockopt打开SO_BROADCAST, 设置广播地址 255.255.255.255,设置广播端口号
广播接收方:将套接字绑定到指定的广播端口号, 监听数据到来

广播发送方大概流程如下:

SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);
// 设置SO_BROADCAST选项有效
BOOL bBroadcast = TRUE;
setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(BOOL));
// 设置广播地址(255.255.255.255) 广播端口号(18000)
SOCKADDR_IN bcast;
bcast.sin_family = AF_INET;
bcast.sin_addr.s_addr = INADDR_BROADCAST; //inet_addr("255.255.255.255");
bcast.sin_port = htons(18000);
// 发送广播
char sz[] = "This is just a test. \r\n";
while(TRUE)
{
	sendto(s, sz, strlen(sz), 0, (sockaddr*)&bcast, sizeof(bcast));
	Sleep(5000);
}

广播接收方大概流程如下:

SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);
// 首先要绑定一个本地地址,指明广播端口号
SOCKADDR_IN sin;
sin.sin_family = AF_INET;
sin.sin_addr.S_un.S_addr = INADDR_ANY;
sin.sin_port = ::ntohs(4567);
if(bind(s, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
{ 
	printf(" bind() failed \n");
	return;
}
// 接收广播
SOCKADDR_IN addrRemote;
int nLen = sizeof(addrRemote);
char sz[256];
while(TRUE)
{ 
	int nRet = ::recvfrom(s, sz, 256, 0, (sockaddr*)&addrRemote, &nLen);
	if(nRet > 0)
	{ 
		sz[nRet] = '\0';
		printf(sz);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值