设为首页 加入收藏

TOP

2.2.2 小试牛刀--模拟实现Windows的UDP程序(9)
2013-10-07 15:54:52 来源: 作者: 【 】 浏览:80
Tags:2.2.2 小试牛刀 模拟 实现 Windows UDP 程序

2.2.2  小试牛刀--模拟实现Windows的UDP程序(9)

(6) 广播信息接收模块

广播消息接收模块实现广播消息的接收功能,即在指定广播地址和端口上接收指定数量的消息。该模块由函数broadcastRec()来实现。同发送广播消息一样,该函数也需要接收选项"-h(广播地址)"、"-p(端口号)"、"-n(发送数量)",如果用户没有提供这些选项,函数将以默认值执行。需要注意的是,如果发送端不是采用默认的广播地址和端口号,则接收端也要使用相应的广播地址和端口号,即通过选项来提供与发送端相同的广播地址和端口号。具体实现代码如下:

  1. /*广播消息接收函数*/  
  2. void broadcastRec()  
  3. {     
  4.     BOOL optval = TRUE;  
  5. int addrBroLen;  
  6. char buf[256];  
  7. DWORD i = 0;  
  8. /*该地址用来绑定套接字*/  
  9. addrRec.sin_family = AF_INET;  
  10. addrRec.sin_addr.s_addr = 0;  
  11. addrRec.sin_port = htons(bPort);  
  12.  
  13. /*该地址用来接收网路上广播的消息*/  
  14. addrBro.sin_family = AF_INET;  
  15. addrBro.sin_addr.s_addr = bcastAddr;  
  16. addrBro.sin_port = htons(bPort);  
  17.  
  18. addrBroLen = sizeof(addrBro);  
  19. //创建UDP套接字  
  20. socketsocketRec = socket(AF_INET, SOCK_DGRAM, 0);  
  21. /*如果创建失败*/  
  22. if(socketRec == INVALID_SOCKET)  
  23. {  
  24. printf("Create socket error:%d", WSAGetLastError());  
  25. WSACleanup();  
  26. return;  
  27. }  
  28.  
  29. /*设置该套接字为可重用类型*/  
  30. if(setsockopt(socketRec,SOL_SOCKET,SO_REUSEADDR,(char FAR *)&optval,  
  31. sizeof(optval)) == SOCKET_ERROR)  
  32. /*如果设置失败*/  
  33. {  
  34. printf("setsockopt failed:%d", WSAGetLastError());  
  35. closesocket(socketRec);  
  36. WSACleanup();  
  37. return;  
  38. }  
  39. /*绑定套接字和地址*/  
  40. if(bind(socketRec,(struct sockaddr *)&addrRec,  
  41. sizeof(struct sockaddr_in)) == SOCKET_ERROR)  
  42. /*如果绑定失败*/  
  43. {  
  44. printf("bind failed with: %d\n", WSAGetLastError());  
  45. closesocket(socketRec);  
  46. WSACleanup();  
  47. return;  
  48. }  
  49. /*从广播地址接收消息*/  
  50. while(i < bCount)  
  51. {  
  52. recvfrom(socketRec,buf,256,0,  
  53. (struct sockaddr FAR *)&addrBro,  
  54. (int FAR *)&addrBroLen);  
  55. /*延迟2秒钟*/  
  56. Sleep(2000);  
  57. /*输出接收到缓冲区的消息*/  
  58. printf("%s\n", buf);  
  59. /*清空缓冲区*/  
  60. ZeroMemory(buf, 256);  
  61. i++;  
  62. }  
  63. /*接收完毕后关闭套接字,释放占用资源*/  
  64. closesocket(socketRec);  
  65. WSACleanup();  
  66. }  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.4.2 具体实现(3) 下一篇2.2.2 小试牛刀--模拟实现Windows..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++中智能指针的性能 (2025-12-25 03:49:29)
·如何用智能指针实现c (2025-12-25 03:49:27)
·如何在 C 语言中管理 (2025-12-25 03:20:14)
·C语言和内存管理有什 (2025-12-25 03:20:11)
·为什么C语言从不被淘 (2025-12-25 03:20:08)