设为首页 加入收藏

TOP

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

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

(8) 多播消息发送模块

多播消息发送模块实现多播消息的发送,即发送者(需提高"-s"选项标识)在指定的多播组、端口发送指定数量的多播消息,消息发送过程中还可以设置是否允许消息返还(通过"-1"设置)。该模块由函数multicastSend()来实现,其实现过程是先调用mulControl()函数实现准备工作(多播的套接创建和绑定功能、套接字选项设置功能、多播级加入功能等),然后发送指定数量的消息。与广播函数一样,该函数也需要接收选项"-h(广播地址)"、"-p(端口号)"、"-i(本地接口)"和"-n(发送数量)",如果用户没有提供这些选项,函数将以默认值执行。具体实现代码如下:

  1. /*多播消息发送函数*/  
  2. void multicastSend()  
  3. {  
  4.       
  5. TCHAR sendbuf[BUFSIZE];  
  6. DWORD i;  
  7. int ret;  
  8.  
  9. mulControl();  
  10. /*发送mCount条消息*/  
  11. for(i=0; i<mCount; i++)  
  12. {  
  13. /*将待发送的消息写入发送缓冲区*/  
  14. sprintf(sendbuf, "server 1: This is a test: %d", i);  
  15. ret = sendto(socketMul, (char*)sendbuf, strlen(sendbuf), 0,  
  16.   (struct sockaddr *)&addrMul, sizeof(addrMul));  
  17. /*如果发送失败*/  
  18. if(ret == SOCKET_ERROR)  
  19. {  
  20. printf("sendto failed with: %d\n", WSAGetLastError());  
  21. closesocket(sockJoin);  
  22. closesocket(socketMul);  
  23. WSACleanup();  
  24. return;  
  25. }  
  26. /*如果发送成功*/  
  27. else  
  28. printf("Send message %d\n", i);  
  29. Sleep(500);  
  30. }  
  31. /*关闭套接字、释放占用资源*/  
  32. closesocket(socketMul);  
  33. WSACleanup();  
  34. }  

(9) 多播消息接收模块

多播消息接收模块可实现多播消息的接收,即接收者在指定的多播级、端口来接收指定数量的多播消息。该模块由函数multicastRec()实现,其实现过程是先调用mulControl()函数实现准备工作(多播的套接创建和绑定功能、套接字选项设置功能、多播级加入功能等),然后接收指定数量的消息。该函数也需要接收选项"-h(广播地址)"、"-p(端口号)"、"-n(发送数量)",如果用户没有提供这些选项,函数将以默认值执行。具体实现代码如下:

  1. /*多播消息接收函数*/  
  2. void multicastRec()  
  3. {  
  4. DWORD i;  
  5. struct sockaddr_in  from;  
  6. TCHAR recvbuf[BUFSIZE];  
  7. int ret;  
  8. int len = sizeof(struct sockaddr_in);  
  9. mulControl();  
  10. /*接收mCount条消息*/  
  11. for(i=0; i<mCount; i++)  
  12. {  
  13. /*将接收的消息写入接收缓冲区*/  
  14. if ((ret = recvfrom(socketMul, recvbuf, BUFSIZE, 0,  
  15. (struct sockaddr *)&from, &len)) == SOCKET_ERROR)  
  16. /*如果接收不成功*/  
  17. {  
  18. printf("recvfrom failed with: %d\n", WSAGetLastError());  
  19. closesocket(sockJoin);  
  20. closesocket(socketMul);  
  21. WSACleanup();  
  22. return;  
  23. }  
  24. /*接收成功,输出接收的消息*/  
  25. recvbuf[ret] = 0;  
  26. printf("RECV: '%s' from <%s>\n", recvbuf, inet_ntoa(from.sin_addr));  
  27. }  
  28. /*关闭套接字、释放占用资源*/  
  29. closesocket(socketMul);  
  30. WSACleanup();  
  31. }  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇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)