2.2.2 小试牛刀--模拟实现Windows的UDP程序(9)
(6) 广播信息接收模块
广播消息接收模块实现广播消息的接收功能,即在指定广播地址和端口上接收指定数量的消息。该模块由函数broadcastRec()来实现。同发送广播消息一样,该函数也需要接收选项"-h(广播地址)"、"-p(端口号)"、"-n(发送数量)",如果用户没有提供这些选项,函数将以默认值执行。需要注意的是,如果发送端不是采用默认的广播地址和端口号,则接收端也要使用相应的广播地址和端口号,即通过选项来提供与发送端相同的广播地址和端口号。具体实现代码如下:
- /*广播消息接收函数*/
- void broadcastRec()
- {
- BOOL optval = TRUE;
- int addrBroLen;
- char buf[256];
- DWORD i = 0;
- /*该地址用来绑定套接字*/
- addrRec.sin_family = AF_INET;
- addrRec.sin_addr.s_addr = 0;
- addrRec.sin_port = htons(bPort);
-
- /*该地址用来接收网路上广播的消息*/
- addrBro.sin_family = AF_INET;
- addrBro.sin_addr.s_addr = bcastAddr;
- addrBro.sin_port = htons(bPort);
-
- addrBroLen = sizeof(addrBro);
- //创建UDP套接字
- socketsocketRec = socket(AF_INET, SOCK_DGRAM, 0);
- /*如果创建失败*/
- if(socketRec == INVALID_SOCKET)
- {
- printf("Create socket error:%d", WSAGetLastError());
- WSACleanup();
- return;
- }
-
- /*设置该套接字为可重用类型*/
- if(setsockopt(socketRec,SOL_SOCKET,SO_REUSEADDR,(char FAR *)&optval,
- sizeof(optval)) == SOCKET_ERROR)
- /*如果设置失败*/
- {
- printf("setsockopt failed:%d", WSAGetLastError());
- closesocket(socketRec);
- WSACleanup();
- return;
- }
- /*绑定套接字和地址*/
- if(bind(socketRec,(struct sockaddr *)&addrRec,
- sizeof(struct sockaddr_in)) == SOCKET_ERROR)
- /*如果绑定失败*/
- {
- printf("bind failed with: %d\n", WSAGetLastError());
- closesocket(socketRec);
- WSACleanup();
- return;
- }
- /*从广播地址接收消息*/
- while(i < bCount)
- {
- recvfrom(socketRec,buf,256,0,
- (struct sockaddr FAR *)&addrBro,
- (int FAR *)&addrBroLen);
- /*延迟2秒钟*/
- Sleep(2000);
- /*输出接收到缓冲区的消息*/
- printf("%s\n", buf);
- /*清空缓冲区*/
- ZeroMemory(buf, 256);
- i++;
- }
- /*接收完毕后关闭套接字,释放占用资源*/
- closesocket(socketRec);
- WSACleanup();
- }