1、udp传输系统/加载库文件#pragma comment(lib, ws2_32)/加载头文件#include #include #include #include /定义多播常量#define MCASTADDR 224.3.5.8#define MCASTPORT 25000#define BUFSIZE 1024#define MCOUNT 10/定义广播常量#define BCASTPORT 5050#define BCOUNT 10/定义广播全局变量SOCKET socketBro;SOCKET socketRec;struct sockaddr_in addrBro;struct
2、sockaddr_in addrRec;BOOL broadSendFlag;BOOL broadFlag;DWORD bCount;DWORD bcastAddr;short bPort;/定义多播全局变量SOCKET socketMul;SOCKET sockJoin;struct sockaddr_in addrLocal;struct sockaddr_in addrMul;BOOL multiSendFlag;BOOL bLoopBack;BOOL multiFlag;DWORD dwInterface;DWORD dwMulticastGroup;DWORD mCount;shor
3、t mPort;/自定义函数void initial();void GetArgments(int argc, char *argv);void userHelpAll();void userHelpBro();void userHelpMul();void broadcastSend();void broadcastRec();void mulControl();void multicastSend();void multicastRec();void initial() /初始化广播全局变量 bPort = BCASTPORT; bCount = BCOUNT; bcastAddr = I
4、NADDR_BROADCAST; broadSendFlag = FALSE; broadFlag = FALSE; multiFlag = FALSE; /初始化多播全局变量 dwInterface = INADDR_ANY; dwMulticastGroup = inet_addr(MCASTADDR); mPort = MCASTPORT; mCount = MCOUNT; multiSendFlag = FALSE; bLoopBack = FALSE;void GetArgments(int argc, char *argv) int i; /如果参数小于2 if(argc = 1)
5、 userHelpAll(); return ; /获取广播选项 if(argv10=- & argv11=b) broadFlag = TRUE; for(i=2; i 3) bcastAddr = inet_addr(&argvi3); break; /广播端口号 case p: if(strlen(argvi) 3) bPort = atoi(&argvi3); break; /广播数量 case n: bCount = atoi(&argvi3); break; /其他情况转向用户帮助 default: userHelpBro(); ExitProcess(-1); break; re
6、turn; /获取多播选项 if(argv10=- & argv11=m) multiFlag = TRUE; for(i=2; i3) dwMulticastGroup = inet_addr(&argvi3); break; /本地接口地址 case i: if(strlen(argvi) 3) dwInterface = inet_addr(&argvi3); break; /多播端口号 case p: if(strlen(argvi)3) mPort = atoi(&argvi3); break; /环回标志设置为真 case l: bLoopBack = TRUE; break; /
7、发送数量 case n: mCount = atoi(&argvi3); break; /显示用户帮助 default: userHelpMul(); break; return ;/全局用户帮助函数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(B
8、roadcast: -b -s:str -p:int -h:str -n:int n); printf( -b Start the broadcast program.n); printf( -s Act as server (send data); otherwisen); printf( receive data. Default is receiver. n); printf( -p:int Port number to usen); printf( The default port is 5050.n); printf( -h:str The decimal broadcast IP
9、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); otherwisen); printf( receiv
10、e data. Default is receiver. n); printf( -h:str The decimal multicast IP address to joinn); printf( The default group is: %sn, MCASTADDR); printf( -p:int Port number to use n ); printf( The default group is: %sn, MCASTADDR); printf( -i:str Local interface to bind to; by default n); printf( use INADD
11、RY_ANYn); printf( -l Disable loopbackn); printf( -n:int Number of messages to send/receiven); ExitProcess(-1);/广播消息发送函数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_I
12、NET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); /创建失败 if(socketBro = INVALID_SOCKET) printf(Create socket failed: %dn, WSAGetLastError(); WSACleanup(); return ; /设置广播地址各个选项 addrBro.sin_family = AF_INET; addrBro.sin_port = htons(bPort); addrBro.sin_addr.S_un.S_addr = bcastAddr; /设置该套接字为广播类型 if(set
13、sockopt(socketBro, SOL_SOCKET, SO_BROADCAST, (char FAR *)&opt, sizeof(opt) = SOCKET_ERROR) /设置失败 printf(setsockopt failed: %d, WSAGetLastError(); closesocket(socketBro); WSACleanup(); return ; /循环发送消息 while(ibCount) Sleep(1000); /从广播发送消息 ret = sendto(socketBro, smsg, 256, 0, (struct sockaddr*)&addrB
14、ro, nlen); if(ret = SOCKET_ERROR) printf(Send failed: %d!n, i); else printf(Send message %d!n, i); i+; closesocket(socketBro); WSACleanup();/广播消息的接收模块void broadcastRec() BOOL optval = TRUE; int addrBroLen; char buf256; DWORD i = 0; /该地址用来绑定套接字 addrRec.sin_family = AF_INET; addrRec.sin_addr.S_un.S_ad
15、dr = 0; addrRec.sin_port = htons(bPort); addrBro.sin_port = htons(bPort); addrBroLen = sizeof(addrBro); /创建UDP套接字 socketRec = socket(AF_INET, SOCK_DGRAM, 0); if(socketRec = INVALID_SOCKET) printf(Create socket error: %d, WSAGetLastError(); WSACleanup(); return ; /设置该套接字为可重用类型 if(setsockopt(socketRec
16、, SOL_SOCKET, SO_REUSEADDR, (char FAR*)&optval, sizeof(optval) = SOCKET_ERROR) printf(setsockopt failed: %d, WSAGetLastError(); closesocket(socketRec); WSACleanup(); return ; /绑定套接字和地址 if(bind(socketRec, (struct sockaddr *)&addrRec, sizeof(struct sockaddr_in) = SOCKET_ERROR) printf(bind failed with:
17、 %dn, WSAGetLastError(); closesocket(socketRec); WSACleanup(); return ; /从广播地址接收消息 while(ibCount) recvfrom(socketRec, buf, 256, 0, (struct sockaddr FAR *)&addrBro, (int FAR *)&addrBroLen); Sleep(2000); printf(%sn, buf); ZeroMemory(buf, 256); i+; closesocket(socketRec); WSACleanup();/多播控制函数void mulCo
18、ntrol() int optval; /创建多播UDP套接字 if(socketMul = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_MULTIPOINT_C_LEAF | WSA_FLAG_MULTIPOINT_D_LEAF | WSA_FLAG_OVERLAPPED) = INVALID_SOCKET) printf(socket failed with: %dn, WSAGetLastError(); WSACleanup(); return ; /设置本地接口地址 addrLocal.sin_family = AF_INE
19、T; addrLocal.sin_port = htons(mPort); addrRec.sin_addr.S_un.S_addr = dwMulticastGroup; /重新设置TTL值 optval = 8; if(setsockopt(socketMul, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&optval, sizeof(int) = SOCKET_ERROR) printf(setsockopt(IP_MULTICAST_TTL) failed: %dn, WSAGetLastError(); closesocket(socketMul);
20、 WSACleanup(); return ; /如果指定了返还选项 if(bLoopBack) optval = 0; if(setsockopt(socketMul, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&optval, sizeof(optval) = SOCKET_ERROR) printf(setsockopt(IP_MULTICAST_LOOP) failed: %dn, WSAGetLastError(); closesocket(socketMul); WSACleanup(); return ; if(sockJoin = WSAJo
21、inLeaf(socketMul, (SOCKADDR *)&addrMul, sizeof(addrMul), NULL, NULL, NULL, NULL, JL_BOTH) = INVALID_SOCKET) printf(WSAJoinLeaf() failed: %dn, WSAGetLastError(); closesocket(socketMul); return; /多播消息发送模块void multicastSend() TCHAR sendbufBUFSIZE; DWORD i; int ret; mulControl(); /发送mCount条消息 for(i=0; i
22、mCount; +i) sprintf(sendbuf, sever 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(sednto failed with: %dn, WSAGetLastError(); closesocket(sockJoin); closesocket(socketMul); WSACleanup
23、(); return ; else printf(Send message %dn, i); Sleep(500); closesocket(socketMul); WSACleanup();/多播消息接收函数void multicastRec() DWORD i; struct sockaddr_in from; TCHAR recvbufBUFSIZE; int ret; int len = sizeof(struct sockaddr_in); mulControl(); for(i = 0; imCount; +i) if(ret = recvfrom(socketMul, recvb
24、uf, BUFSIZE, 0, (struct sockaddr*)&from, &len) = SOCKET_ERROR) printf(recvfrom failed with: %dn, WSAGetLastError(); closesocket(sockJoin); closesocket(socketMul); WSACleanup(); return ; recvbufret = 0; printf(RECV: %s from n, recvbuf, inet_ntoa(from.sin_addr); closesocket(socketMul); WSACleanup();in
25、t main(int argc, char *argv) WSADATA wsd; initial(); GetArgments(argc, argv); if(WSAStartup(MAKEWORD(2, 2), &wsd) != 0) printf(WSAStartup() failedn); return -1; /如果是执行广播程序 if(broadFlag) if(broadSendFlag) broadcastSend(); return 0; else broadcastRec(); return 0; /多播 if(multiFlag) if(multiSendFlag) multicastSend(); return 0; else multicastRec(); return 0; return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1