2.2.2 小试牛刀--模拟实现Windows的UDP程序(8)
(4) 用户帮助模块
用户帮助模块包括全局用户帮助、广播用户帮助和多播用户帮助,具体实现函数如下。
userHelpAll():实现全局用户帮助。
userHelpBro():实现广播用户帮助。
userHelpMul():实现多播用户帮助。
具体实现代码如下:
- /*全局用户帮助函数*/
- void userHelpAll()
- {
- printf("Please choose broadcast[-b] or multicast[-m] !\n");
- printf("userHelpAll: -b [-s][p][-h][-n] | -m[-s][-h][-p][-i][-l][-n]\n");
- userHelpBro();
- userHelpMul();
- }
-
- /*广播用户帮助函数*/
- void userHelpBro()
- {
- printf("Broadcast: -b -s:str -p:int -h:str -n:int\n");
- printf(" -b Start the broadcast program.\n");
- printf(" -s Act as server (send data); otherwise\n");
- printf(" receive data. Default is receiver.\n");
- printf(" -p:int Port number to use\n ");
- printf(" The default port is 5050.\n");
- printf(" -h:str The decimal broadcast IP address.\n");
- printf(" -n:int The Number of messages to send/receive.\n");
- printf(" The default number is 10.\n");
- }
-
- /*多播用户帮助函数*/
- void userHelpMul()
- {
- printf("Multicast: -m -s -h:str -p:int -i:str -l -n:int\n");
- printf(" -m Start the multicast program.\n");
- printf(" -s Act as server (send data); otherwise\n");
- printf(" receive data. Default is receiver.\n");
- printf(" -h:str The decimal multicast IP address to join\n");
- printf(" The default group is: %s\n", MCASTADDR);
- printf(" -p:int Port number to use\n");
- printf(" The default port is: %d\n", MCASTPORT);
- printf(" -i:str Local interface to bind to; by default \n");
- printf(" use INADDRY_ANY\n");
- printf(" -l Disable loopback\n");
- printf(" -n:int Number of messages to send/receive\n");
- ExitProcess(-1);
- }
(5) 广播信息发送模块
广播消息发送模块实现广播消息的发送功能,即在指定广播地址和端口上发送指定数量的消息。该模块由函数broadcastSend()来实现,该函数需要接收选项"-h(广播地址)"、"-p(端口号)"、"-n(发送数量)",如果用户没有提供这些选项,函数将以默认值执行。具体代码如下:
- /*广播消息发送函数*/
- void broadcastSend()
- {
- /*设置广播的消息*/
- char *smsg = "The message received is from sender!";
- BOOL opt = TRUE;
- int nlen = sizeof(addrBro);
- int ret;
- DWORD i=0;
-
- /*创建UDP套接字*/
- socketBro = WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
- /*如果创建失败*/
- if(socketBro==INVALID_SOCKET)
- {
- printf("Create socket failed:%d\n", WSAGetLastError());
- WSACleanup();
- return;
- }
-
- /*设置广播地址各个选项*/
- addrBro.sin_family = AF_INET;
- addrBro.sin_addr.s_addr = bcastAddr;
- addrBro.sin_port = htons(bPort);
-
- /*设置该套接字为广播类型*/
- if (setsockopt(socketBro,SOL_SOCKET,SO_BROADCAST,(char FAR *)&opt,
- sizeof(opt)) == SOCKET_ERROR)
- /*如果设置失败*/
- {
- printf("setsockopt failed:%d", WSAGetLastError());
- closesocket(socketBro);
- WSACleanup();
- return;
- }
- /*循环发送消息*/
- while(i < bCount)
- {
- /*延迟1秒*/
- Sleep(1000);
- /*从广播地址发送消息*/
- ret = sendto(socketBro,smsg,256,0,(struct sockaddr*)&addrBro,nlen);
- /*如果发送失败*/
- if(ret == SOCKET_ERROR)
- printf("Send failed:%d", WSAGetLastError());
- /*如果发送成功*/
- else
- {
- printf("Send message %d!\n", i);
- }
- i++;
- }
- /*发送完毕后关闭套接字、释放占用资源*/
- closesocket(socketBro);
- WSACleanup();
- }