理论上可以像播放电视节目一样在整个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);
}
}