设为首页 加入收藏

TOP

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

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

(7) 多播功能控制模块

多播功能控制模块是为多播发送模块和多播接收模块服务的,它实现多播的套接创建和绑定功能、套接字选项设置功能、多播组加入功能等。具体实现代码如下:

  1. /*多播控制函数*/  
  2. void mulControl()  
  3. {  
  4. int optval;   
  5. /*创建UDP套接字,用于多播*/  
  6. if ((socketMul = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0,  
  7. WSA_FLAG_MULTIPOINT_C_LEAF   
  8. | WSA_FLAG_MULTIPOINT_D_LEAF   
  9. | WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)  
  10. {  
  11. printf("socket failed with: %d\n", WSAGetLastError());  
  12. WSACleanup();  
  13. return;  
  14. }  
  15.  
  16. /*设置本地接口地址*/  
  17. addrLocal.sin_family = AF_INET;  
  18. addrLocal.sin_port = htons(mPort);  
  19. addrLocal.sin_addr.s_addr = dwInterface;  
  20.  
  21. /*将UDP套接字绑定到本地地址上*/  
  22. if (bind(socketMul, (struct sockaddr *)&addrLocal,   
  23. sizeof(addrLocal)) == SOCKET_ERROR)  
  24. /*如果绑定失败*/  
  25. {  
  26. printf("bind failed with: %d\n", WSAGetLastError());  
  27. closesocket(socketMul);  
  28. WSACleanup();  
  29. return;  
  30. }  
  31.  
  32. /*设置多播地址各个选项*/  
  33. addrMul.sin_family      = AF_INET;  
  34. addrMul.sin_port        = htons(mPort);  
  35. addrMul.sin_addr.s_addr = dwMulticastGroup;  
  36.  
  37. /*重新设置TTL值*/  
  38. optval = 8;  
  39. /*设置多播数据的TTL(存在时间)值。默认情况下,TTL值是1*/  
  40. if (setsockopt(socketMul, IPPROTO_IP, IP_MULTICAST_TTL,   
  41. (char*)&optval, sizeof(int)) == SOCKET_ERROR)  
  42. /*如果设置失败*/  
  43. {  
  44. printf("setsockopt(IP_MULTICAST_TTL) failed: %d\n",  
  45. WSAGetLastError());  
  46. closesocket(socketMul);  
  47. WSACleanup();  
  48. return;  
  49. }  
  50.  
  51. /*如果指定了返还选项*/  
  52. if (bLoopBack)  
  53. {  
  54. /*设置返还选项为假,禁止将发送的数据返还给本地接口*/  
  55. optval = 0;  
  56. if (setsockopt(socketMul, IPPROTO_IP, IP_MULTICAST_LOOP,  
  57. (char*)&optval, sizeof(optval)) == SOCKET_ERROR)  
  58. /*如果设置失败*/  
  59. {  
  60. printf("setsockopt(IP_MULTICAST_LOOP) failed: %d\n",  
  61. WSAGetLastError());  
  62. closesocket(socketMul);  
  63. WSACleanup();  
  64. return;  
  65. }  
  66. }  
  67.  
  68. /*加入多播组*/  
  69. if ((sockJoin=WSAJoinLeaf(socketMul, (SOCKADDR*)&addrMul,   
  70. sizeof(addrMul), NULL, NULL, NULL, NULL,   
  71. JL_BOTH)) == INVALID_SOCKET)  
  72. /*如果加入不成功*/  
  73. {  
  74. printf("WSAJoinLeaf() failed: %d\n", WSAGetLastError());  
  75. closesocket(socketMul);  
  76. WSACleanup();  
  77. return;  
  78. }  
  79. }  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.2.2 小试牛刀--模拟实现Windows.. 下一篇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)