2.2.2 小试牛刀--模拟实现Windows的UDP程序(11)
(8) 多播消息发送模块
多播消息发送模块实现多播消息的发送,即发送者(需提高"-s"选项标识)在指定的多播组、端口发送指定数量的多播消息,消息发送过程中还可以设置是否允许消息返还(通过"-1"设置)。该模块由函数multicastSend()来实现,其实现过程是先调用mulControl()函数实现准备工作(多播的套接创建和绑定功能、套接字选项设置功能、多播级加入功能等),然后发送指定数量的消息。与广播函数一样,该函数也需要接收选项"-h(广播地址)"、"-p(端口号)"、"-i(本地接口)"和"-n(发送数量)",如果用户没有提供这些选项,函数将以默认值执行。具体实现代码如下:
- /*多播消息发送函数*/
- void multicastSend()
- {
-
- TCHAR sendbuf[BUFSIZE];
- DWORD i;
- int ret;
-
- mulControl();
- /*发送mCount条消息*/
- for(i=0; i<mCount; i++)
- {
- /*将待发送的消息写入发送缓冲区*/
- sprintf(sendbuf, "server 1: This is a test: %d", i);
- ret = sendto(socketMul, (char*)sendbuf, strlen(sendbuf), 0,
- (struct sockaddr *)&addrMul, sizeof(addrMul));
- /*如果发送失败*/
- if(ret == SOCKET_ERROR)
- {
- printf("sendto failed with: %d\n", WSAGetLastError());
- closesocket(sockJoin);
- closesocket(socketMul);
- WSACleanup();
- return;
- }
- /*如果发送成功*/
- else
- printf("Send message %d\n", i);
- Sleep(500);
- }
- /*关闭套接字、释放占用资源*/
- closesocket(socketMul);
- WSACleanup();
- }
(9) 多播消息接收模块
多播消息接收模块可实现多播消息的接收,即接收者在指定的多播级、端口来接收指定数量的多播消息。该模块由函数multicastRec()实现,其实现过程是先调用mulControl()函数实现准备工作(多播的套接创建和绑定功能、套接字选项设置功能、多播级加入功能等),然后接收指定数量的消息。该函数也需要接收选项"-h(广播地址)"、"-p(端口号)"、"-n(发送数量)",如果用户没有提供这些选项,函数将以默认值执行。具体实现代码如下:
- /*多播消息接收函数*/
- void multicastRec()
- {
- DWORD i;
- struct sockaddr_in from;
- TCHAR recvbuf[BUFSIZE];
- int ret;
- int len = sizeof(struct sockaddr_in);
- mulControl();
- /*接收mCount条消息*/
- for(i=0; i<mCount; i++)
- {
- /*将接收的消息写入接收缓冲区*/
- if ((ret = recvfrom(socketMul, recvbuf, BUFSIZE, 0,
- (struct sockaddr *)&from, &len)) == SOCKET_ERROR)
- /*如果接收不成功*/
- {
- printf("recvfrom failed with: %d\n", WSAGetLastError());
- closesocket(sockJoin);
- closesocket(socketMul);
- WSACleanup();
- return;
- }
- /*接收成功,输出接收的消息*/
- recvbuf[ret] = 0;
- printf("RECV: '%s' from <%s>\n", recvbuf, inet_ntoa(from.sin_addr));
- }
- /*关闭套接字、释放占用资源*/
- closesocket(socketMul);
- WSACleanup();
- }