udp传输系统.docx
《udp传输系统.docx》由会员分享,可在线阅读,更多相关《udp传输系统.docx(15页珍藏版)》请在冰豆网上搜索。
udp传输系统
//加载库文件
#pragmacomment(lib,"ws2_32")
//加载头文件
#include
//定义多播常量
#defineMCASTADDR"224.3.5.8"
#defineMCASTPORT25000
#defineBUFSIZE1024
#defineMCOUNT10
//定义广播常量
#defineBCASTPORT5050
#defineBCOUNT10
//定义广播全局变量
SOCKETsocketBro;
SOCKETsocketRec;
structsockaddr_inaddrBro;
structsockaddr_inaddrRec;
BOOLbroadSendFlag;
BOOLbroadFlag;
DWORDbCount;
DWORDbcastAddr;
shortbPort;
//定义多播全局变量
SOCKETsocketMul;
SOCKETsockJoin;
structsockaddr_inaddrLocal;
structsockaddr_inaddrMul;
BOOLmultiSendFlag;
BOOLbLoopBack;
BOOLmultiFlag;
DWORDdwInterface;
DWORDdwMulticastGroup;
DWORDmCount;
shortmPort;
//自定义函数
voidinitial();
voidGetArgments(intargc,char**argv);
voiduserHelpAll();
voiduserHelpBro();
voiduserHelpMul();
voidbroadcastSend();
voidbroadcastRec();
voidmulControl();
voidmulticastSend();
voidmulticastRec();
voidinitial()
{
//初始化广播全局变量
bPort=BCASTPORT;
bCount=BCOUNT;
bcastAddr=INADDR_BROADCAST;
broadSendFlag=FALSE;
broadFlag=FALSE;
multiFlag=FALSE;
//初始化多播全局变量
dwInterface=INADDR_ANY;
dwMulticastGroup=inet_addr(MCASTADDR);
mPort=MCASTPORT;
mCount=MCOUNT;
multiSendFlag=FALSE;
bLoopBack=FALSE;
}
voidGetArgments(intargc,char**argv)
inti;
//如果参数小于2
if(argc<=1)
userHelpAll();
return;
//获取广播选项
if(argv[1][0]=='-'&&argv[1][1]=='b')
broadFlag=TRUE;
for(i=2;i{if(argv[i][0]=='-'){switch(tolower(argv[i][1])){//发送者case's':broadSendFlag=TRUE;break;//广播地址case'h':if(strlen(argv[i])>3)bcastAddr=inet_addr(&argv[i][3]);break;//广播端口号case'p':if(strlen(argv[i])>3)bPort=atoi(&argv[i][3]);break;//广播数量case'n':bCount=atoi(&argv[i][3]);break;//其他情况转向用户帮助default:userHelpBro();ExitProcess(-1);break;}}}return;}//获取多播选项if(argv[1][0]=='-'&&argv[1][1]=='m'){multiFlag=TRUE;for(i=2;i{if(argv[i][0]=='-'){switch(tolower(argv[i][1])){//发送者case's':multiSendFlag=TRUE;break;//多播地址case'h':if(strlen(argv[i])>3)dwMulticastGroup=inet_addr(&argv[i][3]);break;//本地接口地址case'i':if(strlen(argv[i])>3)dwInterface=inet_addr(&argv[i][3]);break;//多播端口号case'p':if(strlen(argv[i])>3)mPort=atoi(&argv[i][3]);break;//环回标志设置为真case'l':bLoopBack=TRUE;break;//发送数量case'n':mCount=atoi(&argv[i][3]);break;//显示用户帮助default:userHelpMul();break;}}}}return;}//全局用户帮助函数voiduserHelpAll(){printf("Pleasechoosebroadcast[-b]ormulticast[-m]!\n");printf("userHelpAll:-b[-s][p][-h][-n]|-m[-s][-h][-p][-i][-l][-n]\n");userHelpBro();userHelpMul();}//广播用户帮助函数voiduserHelpBro(){printf("Broadcast:-b-s:str-p:int-h:str-n:int\n");printf("-bStartthebroadcastprogram.\n");printf("-sActasserver(senddata);otherwise\n");printf("receivedata.Defaultisreceiver.\n");printf("-p:intPortnumbertouse\n");printf("Thedefaultportis5050.\n");printf("-h:strThedecimalbroadcastIPaddress.\n");printf("-n:intTheNumberofmessagestosend/receive.\n");printf("Thedefaultnumberis10.\n");}//多播用户帮助voiduserHelpMul(){printf("Multicast:-m-s-h:str-p:int-i:str-l-n:int\n");printf("-mStartthemulticastprogram.\n");printf("-sActasserver(senddata);otherwise\n");printf("receivedata.Defaultisreceiver.\n");printf("-h:strThedecimalmulticastIPaddresstojoin\n");printf("Thedefaultgroupis:%s\n",MCASTADDR);printf("-p:intPortnumbertouse\n");printf("Thedefaultgroupis:%s\n",MCASTADDR);printf("-i:strLocalinterfacetobindto;bydefault\n");printf("useINADDRY_ANY\n");printf("-lDisableloopback\n");printf("-n:intNumberofmessagestosend/receive\n");ExitProcess(-1);}//广播消息发送函数voidbroadcastSend(){//设置广播消息char*smsg="Themessagereceivedisfromsender!";BOOLopt=TRUE;intnlen=sizeof(addrBro);intret;DWORDi=0;//创建UDP套接字socketBro=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);//创建失败if(socketBro==INVALID_SOCKET){printf("Createsocketfailed:%d\n",WSAGetLastError());WSACleanup();return;}//设置广播地址各个选项addrBro.sin_family=AF_INET;addrBro.sin_port=htons(bPort);addrBro.sin_addr.S_un.S_addr=bcastAddr;//设置该套接字为广播类型if(setsockopt(socketBro,SOL_SOCKET,SO_BROADCAST,(charFAR*)&opt,sizeof(opt))==SOCKET_ERROR)//设置失败{printf("setsockoptfailed:%d",WSAGetLastError());closesocket(socketBro);WSACleanup();return;}//循环发送消息while(i{Sleep(1000);//从广播发送消息ret=sendto(socketBro,smsg,256,0,(structsockaddr*)&addrBro,nlen);if(ret=SOCKET_ERROR)printf("Sendfailed:%d!\n",i);elseprintf("Sendmessage%d!\n",i);i++;}closesocket(socketBro);WSACleanup();}//广播消息的接收模块voidbroadcastRec(){BOOLoptval=TRUE;intaddrBroLen;charbuf[256];DWORDi=0;//该地址用来绑定套接字addrRec.sin_family=AF_INET;addrRec.sin_addr.S_un.S_addr=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("Createsocketerror:%d",WSAGetLastError());WSACleanup();return;}//设置该套接字为可重用类型if(setsockopt(socketRec,SOL_SOCKET,SO_REUSEADDR,(charFAR*)&optval,sizeof(optval))==SOCKET_ERROR){printf("setsockoptfailed:%d",WSAGetLastError());closesocket(socketRec);WSACleanup();return;}//绑定套接字和地址if(bind(socketRec,(structsockaddr*)&addrRec,sizeof(structsockaddr_in))==SOCKET_ERROR){printf("bindfailedwith:%d\n",WSAGetLastError());closesocket(socketRec);WSACleanup();return;}//从广播地址接收消息while(i{recvfrom(socketRec,buf,256,0,(structsockaddrFAR*)&addrBro,(intFAR*)&addrBroLen);Sleep(2000);printf("%s\n",buf);ZeroMemory(buf,256);i++;}closesocket(socketRec);WSACleanup();}//多播控制函数voidmulControl(){intoptval;//创建多播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("socketfailedwith:%d\n",WSAGetLastError());WSACleanup();return;}//设置本地接口地址addrLocal.sin_family=AF_INET;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:%d\n",WSAGetLastError());closesocket(socketMul);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:%d\n",WSAGetLastError());closesocket(socketMul);WSACleanup();return;}}if((sockJoin=WSAJoinLeaf(socketMul,(SOCKADDR*)&addrMul,sizeof(addrMul),NULL,NULL,NULL,NULL,JL_BOTH)==INVALID_SOCKET)){printf("WSAJoinLeaf()failed:%d\n",WSAGetLastError());closesocket(socketMul);return;}}//多播消息发送模块voidmulticastSend(){TCHARsendbuf[BUFSIZE];DWORDi;intret;mulControl();//发送mCount条消息for(i=0;i{sprintf(sendbuf,"sever1:Thisisatest:%d",i);ret=sendto(socketMul,(char*)sendbuf,strlen(sendbuf),0,(structsockaddr*)&addrMul,sizeof(addrMul));if(ret==SOCKET_ERROR){printf("sedntofailedwith:%d\n",WSAGetLastError());closesocket(sockJoin);closesocket(socketMul);WSACleanup();return;}elseprintf("Sendmessage%d\n",i);Sleep(500);}closesocket(socketMul);WSACleanup();}//多播消息接收函数voidmulticastRec(){DWORDi;structsockaddr_infrom;TCHARrecvbuf[BUFSIZE];intret;intlen=sizeof(structsockaddr_in);mulControl();for(i=0;i{if((ret=recvfrom(socketMul,recvbuf,BUFSIZE,0,(structsockaddr*)&from,&len))==SOCKET_ERROR){printf("recvfromfailedwith:%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();}intmain(intargc,char**argv){WSADATAwsd;initial();GetArgments(argc,argv);if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){printf("WSAStartup()failed\n");return-1;}//如果是执行广播程序if(broadFlag){if(broadSendFlag){broadcastSend();return0;}else{broadcastRec();return0;}}//多播if(multiFlag){if(multiSendFlag){multicastSend();return0;}else{multicastRec();return0;}}return0;}
if(argv[i][0]=='-')
switch(tolower(argv[i][1]))
//发送者
case's':
broadSendFlag=TRUE;
break;
//广播地址
case'h':
if(strlen(argv[i])>3)
bcastAddr=inet_addr(&argv[i][3]);
//广播端口号
case'p':
bPort=atoi(&argv[i][3]);
//广播数量
case'n':
bCount=atoi(&argv[i][3]);
//其他情况转向用户帮助
default:
userHelpBro();
ExitProcess(-1);
//获取多播选项
if(argv[1][0]=='-'&&argv[1][1]=='m')
multiFlag=TRUE;
for(i=2;i{if(argv[i][0]=='-'){switch(tolower(argv[i][1])){//发送者case's':multiSendFlag=TRUE;break;//多播地址case'h':if(strlen(argv[i])>3)dwMulticastGroup=inet_addr(&argv[i][3]);break;//本地接口地址case'i':if(strlen(argv[i])>3)dwInterface=inet_addr(&argv[i][3]);break;//多播端口号case'p':if(strlen(argv[i])>3)mPort=atoi(&argv[i][3]);break;//环回标志设置为真case'l':bLoopBack=TRUE;break;//发送数量case'n':mCount=atoi(&argv[i][3]);break;//显示用户帮助default:userHelpMul();break;}}}}return;}//全局用户帮助函数voiduserHelpAll(){printf("Pleasechoosebroadcast[-b]ormulticast[-m]!\n");printf("userHelpAll:-b[-s][p][-h][-n]|-m[-s][-h][-p][-i][-l][-n]\n");userHelpBro();userHelpMul();}//广播用户帮助函数voiduserHelpBro(){printf("Broadcast:-b-s:str-p:int-h:str-n:int\n");printf("-bStartthebroadcastprogram.\n");printf("-sActasserver(senddata);otherwise\n");printf("receivedata.Defaultisreceiver.\n");printf("-p:intPortnumbertouse\n");printf("Thedefaultportis5050.\n");printf("-h:strThedecimalbroadcastIPaddress.\n");printf("-n:intTheNumberofmessagestosend/receive.\n");printf("Thedefaultnumberis10.\n");}//多播用户帮助voiduserHelpMul(){printf("Multicast:-m-s-h:str-p:int-i:str-l-n:int\n");printf("-mStartthemulticastprogram.\n");printf("-sActasserver(senddata);otherwise\n");printf("receivedata.Defaultisreceiver.\n");printf("-h:strThedecimalmulticastIPaddresstojoin\n");printf("Thedefaultgroupis:%s\n",MCASTADDR);printf("-p:intPortnumbertouse\n");printf("Thedefaultgroupis:%s\n",MCASTADDR);printf("-i:strLocalinterfacetobindto;bydefault\n");printf("useINADDRY_ANY\n");printf("-lDisableloopback\n");printf("-n:intNumberofmessagestosend/receive\n");ExitProcess(-1);}//广播消息发送函数voidbroadcastSend(){//设置广播消息char*smsg="Themessagereceivedisfromsender!";BOOLopt=TRUE;intnlen=sizeof(addrBro);intret;DWORDi=0;//创建UDP套接字socketBro=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);//创建失败if(socketBro==INVALID_SOCKET){printf("Createsocketfailed:%d\n",WSAGetLastError());WSACleanup();return;}//设置广播地址各个选项addrBro.sin_family=AF_INET;addrBro.sin_port=htons(bPort);addrBro.sin_addr.S_un.S_addr=bcastAddr;//设置该套接字为广播类型if(setsockopt(socketBro,SOL_SOCKET,SO_BROADCAST,(charFAR*)&opt,sizeof(opt))==SOCKET_ERROR)//设置失败{printf("setsockoptfailed:%d",WSAGetLastError());closesocket(socketBro);WSACleanup();return;}//循环发送消息while(i{Sleep(1000);//从广播发送消息ret=sendto(socketBro,smsg,256,0,(structsockaddr*)&addrBro,nlen);if(ret=SOCKET_ERROR)printf("Sendfailed:%d!\n",i);elseprintf("Sendmessage%d!\n",i);i++;}closesocket(socketBro);WSACleanup();}//广播消息的接收模块voidbroadcastRec(){BOOLoptval=TRUE;intaddrBroLen;charbuf[256];DWORDi=0;//该地址用来绑定套接字addrRec.sin_family=AF_INET;addrRec.sin_addr.S_un.S_addr=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("Createsocketerror:%d",WSAGetLastError());WSACleanup();return;}//设置该套接字为可重用类型if(setsockopt(socketRec,SOL_SOCKET,SO_REUSEADDR,(charFAR*)&optval,sizeof(optval))==SOCKET_ERROR){printf("setsockoptfailed:%d",WSAGetLastError());closesocket(socketRec);WSACleanup();return;}//绑定套接字和地址if(bind(socketRec,(structsockaddr*)&addrRec,sizeof(structsockaddr_in))==SOCKET_ERROR){printf("bindfailedwith:%d\n",WSAGetLastError());closesocket(socketRec);WSACleanup();return;}//从广播地址接收消息while(i{recvfrom(socketRec,buf,256,0,(structsockaddrFAR*)&addrBro,(intFAR*)&addrBroLen);Sleep(2000);printf("%s\n",buf);ZeroMemory(buf,256);i++;}closesocket(socketRec);WSACleanup();}//多播控制函数voidmulControl(){intoptval;//创建多播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("socketfailedwith:%d\n",WSAGetLastError());WSACleanup();return;}//设置本地接口地址addrLocal.sin_family=AF_INET;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:%d\n",WSAGetLastError());closesocket(socketMul);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:%d\n",WSAGetLastError());closesocket(socketMul);WSACleanup();return;}}if((sockJoin=WSAJoinLeaf(socketMul,(SOCKADDR*)&addrMul,sizeof(addrMul),NULL,NULL,NULL,NULL,JL_BOTH)==INVALID_SOCKET)){printf("WSAJoinLeaf()failed:%d\n",WSAGetLastError());closesocket(socketMul);return;}}//多播消息发送模块voidmulticastSend(){TCHARsendbuf[BUFSIZE];DWORDi;intret;mulControl();//发送mCount条消息for(i=0;i{sprintf(sendbuf,"sever1:Thisisatest:%d",i);ret=sendto(socketMul,(char*)sendbuf,strlen(sendbuf),0,(structsockaddr*)&addrMul,sizeof(addrMul));if(ret==SOCKET_ERROR){printf("sedntofailedwith:%d\n",WSAGetLastError());closesocket(sockJoin);closesocket(socketMul);WSACleanup();return;}elseprintf("Sendmessage%d\n",i);Sleep(500);}closesocket(socketMul);WSACleanup();}//多播消息接收函数voidmulticastRec(){DWORDi;structsockaddr_infrom;TCHARrecvbuf[BUFSIZE];intret;intlen=sizeof(structsockaddr_in);mulControl();for(i=0;i{if((ret=recvfrom(socketMul,recvbuf,BUFSIZE,0,(structsockaddr*)&from,&len))==SOCKET_ERROR){printf("recvfromfailedwith:%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();}intmain(intargc,char**argv){WSADATAwsd;initial();GetArgments(argc,argv);if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){printf("WSAStartup()failed\n");return-1;}//如果是执行广播程序if(broadFlag){if(broadSendFlag){broadcastSend();return0;}else{broadcastRec();return0;}}//多播if(multiFlag){if(multiSendFlag){multicastSend();return0;}else{multicastRec();return0;}}return0;}
multiSendFlag=TRUE;
//多播地址
dwMulticastGroup=inet_addr(&argv[i][3]);
//本地接口地址
case'i':
dwInterface=inet_addr(&argv[i][3]);
//多播端口号
mPort=atoi(&argv[i][3]);
//环回标志设置为真
case'l':
bLoopBack=TRUE;
//发送数量
mCount=atoi(&argv[i][3]);
//显示用户帮助
userHelpMul();
//全局用户帮助函数
voiduserHelpAll()
printf("Pleasechoosebroadcast[-b]ormulticast[-m]!
\n");
printf("userHelpAll:
-b[-s][p][-h][-n]|-m[-s][-h][-p][-i][-l][-n]\n");
//广播用户帮助函数
voiduserHelpBro()
printf("Broadcast:
-b-s:
str-p:
int-h:
str-n:
int\n");
printf("-bStartthebroadcastprogram.\n");
printf("-sActasserver(senddata);otherwise\n");
printf("receivedata.Defaultisreceiver.\n");
printf("-p:
intPortnumbertouse\n");
printf("Thedefaultportis5050.\n");
printf("-h:
strThedecimalbroadcastIPaddress.\n");
printf("-n:
intTheNumberofmessagestosend/receive.\n");
printf("Thedefaultnumberis10.\n");
//多播用户帮助
voiduserHelpMul()
printf("Multicast:
-m-s-h:
int-i:
str-l-n:
printf("-mStartthemulticastprogram.\n");
strThedecimalmulticastIPaddresstojoin\n");
printf("Thedefaultgroupis:
%s\n",MCASTADDR);
printf("-i:
strLocalinterfacetobindto;bydefault\n");
printf("useINADDRY_ANY\n");
printf("-lDisableloopback\n");
intNumberofmessagestosend/receive\n");
//广播消息发送函数
voidbroadcastSend()
//设置广播消息
char*smsg="Themessagereceivedisfromsender!
";
BOOLopt=TRUE;
intnlen=sizeof(addrBro);
intret;
DWORDi=0;
//创建UDP套接字
socketBro=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
//创建失败
if(socketBro==INVALID_SOCKET)
printf("Createsocketfailed:
%d\n",WSAGetLastError());
WSACleanup();
//设置广播地址各个选项
addrBro.sin_family=AF_INET;
addrBro.sin_port=htons(bPort);
addrBro.sin_addr.S_un.S_addr=bcastAddr;
//设置该套接字为广播类型
if(setsockopt(socketBro,SOL_SOCKET,SO_BROADCAST,(charFAR*)&opt,
sizeof(opt))==SOCKET_ERROR)//设置失败
printf("setsockoptfailed:
%d",WSAGetLastError());
closesocket(socketBro);
//循环发送消息
while(i{Sleep(1000);//从广播发送消息ret=sendto(socketBro,smsg,256,0,(structsockaddr*)&addrBro,nlen);if(ret=SOCKET_ERROR)printf("Sendfailed:%d!\n",i);elseprintf("Sendmessage%d!\n",i);i++;}closesocket(socketBro);WSACleanup();}//广播消息的接收模块voidbroadcastRec(){BOOLoptval=TRUE;intaddrBroLen;charbuf[256];DWORDi=0;//该地址用来绑定套接字addrRec.sin_family=AF_INET;addrRec.sin_addr.S_un.S_addr=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("Createsocketerror:%d",WSAGetLastError());WSACleanup();return;}//设置该套接字为可重用类型if(setsockopt(socketRec,SOL_SOCKET,SO_REUSEADDR,(charFAR*)&optval,sizeof(optval))==SOCKET_ERROR){printf("setsockoptfailed:%d",WSAGetLastError());closesocket(socketRec);WSACleanup();return;}//绑定套接字和地址if(bind(socketRec,(structsockaddr*)&addrRec,sizeof(structsockaddr_in))==SOCKET_ERROR){printf("bindfailedwith:%d\n",WSAGetLastError());closesocket(socketRec);WSACleanup();return;}//从广播地址接收消息while(i{recvfrom(socketRec,buf,256,0,(structsockaddrFAR*)&addrBro,(intFAR*)&addrBroLen);Sleep(2000);printf("%s\n",buf);ZeroMemory(buf,256);i++;}closesocket(socketRec);WSACleanup();}//多播控制函数voidmulControl(){intoptval;//创建多播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("socketfailedwith:%d\n",WSAGetLastError());WSACleanup();return;}//设置本地接口地址addrLocal.sin_family=AF_INET;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:%d\n",WSAGetLastError());closesocket(socketMul);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:%d\n",WSAGetLastError());closesocket(socketMul);WSACleanup();return;}}if((sockJoin=WSAJoinLeaf(socketMul,(SOCKADDR*)&addrMul,sizeof(addrMul),NULL,NULL,NULL,NULL,JL_BOTH)==INVALID_SOCKET)){printf("WSAJoinLeaf()failed:%d\n",WSAGetLastError());closesocket(socketMul);return;}}//多播消息发送模块voidmulticastSend(){TCHARsendbuf[BUFSIZE];DWORDi;intret;mulControl();//发送mCount条消息for(i=0;i{sprintf(sendbuf,"sever1:Thisisatest:%d",i);ret=sendto(socketMul,(char*)sendbuf,strlen(sendbuf),0,(structsockaddr*)&addrMul,sizeof(addrMul));if(ret==SOCKET_ERROR){printf("sedntofailedwith:%d\n",WSAGetLastError());closesocket(sockJoin);closesocket(socketMul);WSACleanup();return;}elseprintf("Sendmessage%d\n",i);Sleep(500);}closesocket(socketMul);WSACleanup();}//多播消息接收函数voidmulticastRec(){DWORDi;structsockaddr_infrom;TCHARrecvbuf[BUFSIZE];intret;intlen=sizeof(structsockaddr_in);mulControl();for(i=0;i{if((ret=recvfrom(socketMul,recvbuf,BUFSIZE,0,(structsockaddr*)&from,&len))==SOCKET_ERROR){printf("recvfromfailedwith:%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();}intmain(intargc,char**argv){WSADATAwsd;initial();GetArgments(argc,argv);if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){printf("WSAStartup()failed\n");return-1;}//如果是执行广播程序if(broadFlag){if(broadSendFlag){broadcastSend();return0;}else{broadcastRec();return0;}}//多播if(multiFlag){if(multiSendFlag){multicastSend();return0;}else{multicastRec();return0;}}return0;}
Sleep(1000);
//从广播发送消息
ret=sendto(socketBro,smsg,256,0,(structsockaddr*)&addrBro,nlen);
if(ret=SOCKET_ERROR)
printf("Sendfailed:
%d!
\n",i);
else
printf("Sendmessage%d!
i++;
//广播消息的接收模块
voidbroadcastRec()
BOOLoptval=TRUE;
intaddrBroLen;
charbuf[256];
//该地址用来绑定套接字
addrRec.sin_family=AF_INET;
addrRec.sin_addr.S_un.S_addr=0;
addrRec.sin_port=htons(bPort);
addrBroLen=sizeof(addrBro);
socketRec=socket(AF_INET,SOCK_DGRAM,0);
if(socketRec==INVALID_SOCKET)
printf("Createsocketerror:
//设置该套接字为可重用类型
if(setsockopt(socketRec,SOL_SOCKET,SO_REUSEADDR,(charFAR*)&optval,
sizeof(optval))==SOCKET_ERROR)
closesocket(socketRec);
//绑定套接字和地址
if(bind(socketRec,(structsockaddr*)&addrRec,
sizeof(structsockaddr_in))==SOCKET_ERROR)
printf("bindfailedwith:
//从广播地址接收消息
while(i{recvfrom(socketRec,buf,256,0,(structsockaddrFAR*)&addrBro,(intFAR*)&addrBroLen);Sleep(2000);printf("%s\n",buf);ZeroMemory(buf,256);i++;}closesocket(socketRec);WSACleanup();}//多播控制函数voidmulControl(){intoptval;//创建多播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("socketfailedwith:%d\n",WSAGetLastError());WSACleanup();return;}//设置本地接口地址addrLocal.sin_family=AF_INET;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:%d\n",WSAGetLastError());closesocket(socketMul);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:%d\n",WSAGetLastError());closesocket(socketMul);WSACleanup();return;}}if((sockJoin=WSAJoinLeaf(socketMul,(SOCKADDR*)&addrMul,sizeof(addrMul),NULL,NULL,NULL,NULL,JL_BOTH)==INVALID_SOCKET)){printf("WSAJoinLeaf()failed:%d\n",WSAGetLastError());closesocket(socketMul);return;}}//多播消息发送模块voidmulticastSend(){TCHARsendbuf[BUFSIZE];DWORDi;intret;mulControl();//发送mCount条消息for(i=0;i{sprintf(sendbuf,"sever1:Thisisatest:%d",i);ret=sendto(socketMul,(char*)sendbuf,strlen(sendbuf),0,(structsockaddr*)&addrMul,sizeof(addrMul));if(ret==SOCKET_ERROR){printf("sedntofailedwith:%d\n",WSAGetLastError());closesocket(sockJoin);closesocket(socketMul);WSACleanup();return;}elseprintf("Sendmessage%d\n",i);Sleep(500);}closesocket(socketMul);WSACleanup();}//多播消息接收函数voidmulticastRec(){DWORDi;structsockaddr_infrom;TCHARrecvbuf[BUFSIZE];intret;intlen=sizeof(structsockaddr_in);mulControl();for(i=0;i{if((ret=recvfrom(socketMul,recvbuf,BUFSIZE,0,(structsockaddr*)&from,&len))==SOCKET_ERROR){printf("recvfromfailedwith:%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();}intmain(intargc,char**argv){WSADATAwsd;initial();GetArgments(argc,argv);if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){printf("WSAStartup()failed\n");return-1;}//如果是执行广播程序if(broadFlag){if(broadSendFlag){broadcastSend();return0;}else{broadcastRec();return0;}}//多播if(multiFlag){if(multiSendFlag){multicastSend();return0;}else{multicastRec();return0;}}return0;}
recvfrom(socketRec,buf,256,0,(structsockaddrFAR*)&addrBro,(intFAR*)&addrBroLen);
Sleep(2000);
printf("%s\n",buf);
ZeroMemory(buf,256);
//多播控制函数
voidmulControl()
intoptval;
//创建多播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("socketfailedwith:
//设置本地接口地址
addrLocal.sin_family=AF_INET;
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:
closesocket(socketMul);
//如果指定了返还选项
if(bLoopBack)
optval=0;
if(setsockopt(socketMul,IPPROTO_IP,IP_MULTICAST_LOOP,
(char*)&optval,sizeof(optval))==SOCKET_ERROR)
printf("setsockopt(IP_MULTICAST_LOOP)failed:
if((sockJoin=WSAJoinLeaf(socketMul,(SOCKADDR*)&addrMul,
sizeof(addrMul),NULL,NULL,NULL,NULL,
JL_BOTH)==INVALID_SOCKET))
printf("WSAJoinLeaf()failed:
//多播消息发送模块
voidmulticastSend()
TCHARsendbuf[BUFSIZE];
DWORDi;
mulControl();
//发送mCount条消息
for(i=0;i{sprintf(sendbuf,"sever1:Thisisatest:%d",i);ret=sendto(socketMul,(char*)sendbuf,strlen(sendbuf),0,(structsockaddr*)&addrMul,sizeof(addrMul));if(ret==SOCKET_ERROR){printf("sedntofailedwith:%d\n",WSAGetLastError());closesocket(sockJoin);closesocket(socketMul);WSACleanup();return;}elseprintf("Sendmessage%d\n",i);Sleep(500);}closesocket(socketMul);WSACleanup();}//多播消息接收函数voidmulticastRec(){DWORDi;structsockaddr_infrom;TCHARrecvbuf[BUFSIZE];intret;intlen=sizeof(structsockaddr_in);mulControl();for(i=0;i{if((ret=recvfrom(socketMul,recvbuf,BUFSIZE,0,(structsockaddr*)&from,&len))==SOCKET_ERROR){printf("recvfromfailedwith:%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();}intmain(intargc,char**argv){WSADATAwsd;initial();GetArgments(argc,argv);if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){printf("WSAStartup()failed\n");return-1;}//如果是执行广播程序if(broadFlag){if(broadSendFlag){broadcastSend();return0;}else{broadcastRec();return0;}}//多播if(multiFlag){if(multiSendFlag){multicastSend();return0;}else{multicastRec();return0;}}return0;}
sprintf(sendbuf,"sever1:
Thisisatest:
%d",i);
ret=sendto(socketMul,(char*)sendbuf,strlen(sendbuf),0,
(structsockaddr*)&addrMul,sizeof(addrMul));
if(ret==SOCKET_ERROR)
printf("sedntofailedwith:
closesocket(sockJoin);
printf("Sendmessage%d\n",i);
Sleep(500);
//多播消息接收函数
voidmulticastRec()
structsockaddr_infrom;
TCHARrecvbuf[BUFSIZE];
intlen=sizeof(structsockaddr_in);
for(i=0;i{if((ret=recvfrom(socketMul,recvbuf,BUFSIZE,0,(structsockaddr*)&from,&len))==SOCKET_ERROR){printf("recvfromfailedwith:%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();}intmain(intargc,char**argv){WSADATAwsd;initial();GetArgments(argc,argv);if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){printf("WSAStartup()failed\n");return-1;}//如果是执行广播程序if(broadFlag){if(broadSendFlag){broadcastSend();return0;}else{broadcastRec();return0;}}//多播if(multiFlag){if(multiSendFlag){multicastSend();return0;}else{multicastRec();return0;}}return0;}
if((ret=recvfrom(socketMul,recvbuf,BUFSIZE,0,
(structsockaddr*)&from,&len))==SOCKET_ERROR)
printf("recvfromfailedwith:
recvbuf[ret]=0;
printf("RECV:
'%s'from<%s>\n",recvbuf,inet_ntoa(from.sin_addr));
intmain(intargc,char**argv)
WSADATAwsd;
initial();
GetArgments(argc,argv);
if(WSAStartup(MAKEWORD(2,2),&wsd)!
=0)
printf("WSAStartup()failed\n");
return-1;
//如果是执行广播程序
if(broadFlag)
if(broadSendFlag)
broadcastSend();
return0;
broadcastRec();
//多播
if(multiFlag)
if(multiSendFlag)
multicastSend();
multicastRec();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1