当前位置:文档之家› UDP程序设计(c语言课程设计)

UDP程序设计(c语言课程设计)

07网络工程本北4-626寝室负责人:林型超第十一章UDP程序设计信息简介:UDP协议,即拥护数据报协议(Use Datagram Protocol).是一个简单的面向数据报的传输层协议.他不提供可靠性,即只把应用程序传给IP层的数据发送出去,但是并不能保证他们能到达目的.广播和多播是基于UDP协议的两种消息发送机制.广播数据即从一个工作站发出,局域网内的其他所有工作站都能收到它.IP协议下,多播是广播的一种变形,IP多播要求将对收发数据感兴趣的所有主机加入到一个特定的组.设计目的: 本章实现的程序即有广播的功能又有多播的功能,能实现基本的广播和多播机制,其主要包括如下功能.1) 提供广播机制.(1) 能设定身份,即是广播消息发送者还是接收者,默认是消息接收者.(2) 能在默认的广播地址和端口号上发送广播消息,接收广播广播消息.(3) 能指定广播地址,端口号,发送(或接收)数量选项进行广播消息的发送和接收.2) 提供多播机制(1) 能制定身份,即是多播消息发送者好事接收者,默认是消息接收者.(2) 主机能加入一个指定多播组.(3) 能以默认选项发送多播消息.接收多播消息.(4) 能指定多播地址,本地接口地址,端口号,发送(或接收)数量和数据反还标志选项进行多播消息的发送和接收.总体设计功能模块设计1.功能模块图本程序有3大部分组成,即广播模块,多播模块部分,如图11.1所示.其中公共模块和多播模块共享的部分,包括初始化模块,参数获取模块和用户帮助模块;广播模块包括广播消息模块;多播模块包括多播功能控制模块,多播消息发送模块和多播消息接收模块.图11.1 功能模块图1) 公共模块(1) 初始化模块.该模块主要用于初始化全局变量,为全局变量赋初始值.(2) 参数获取模块.该模块用于获取用户提供的参数,包括获取广播参数,多播参数和区分广播与多播公共参数等.(3) 用户帮助模块.该模块应于显示用户帮助,包括显示公共帮助,广播帮助和多播帮助.2) 广播模块(1) 广播消息发送模块.该模块用于现实在指定广播地址和端口发送指定数量的广播消息.(2) 广播消息接收模块.该模块用于现实在指定广播地址和端口接收指定数量的广播消息.3) 多播模块(1) 多播功能控制模块.该模块用于现实多播套接字的创建和绑定,多播地址的设定,多播数据的设置,数据反还选项的设置,以及多播组的加入等.(2) 多拨消息发送模块.该模块用于现实在指定多播组发送多播消息.(3) 多播消息接收模块.该模块用于现实在指定多播组接收多波消息.2. 系统流程图系统流程图如图11.2所示.程序首先初始化全局变量,包括广播(多播)地址,端楼号,发送(接收)消息数量等,然后花圈用户提供的参数,并初始化Winsock 初始也成功则判断是进行广播还是多播程序;如果是广播,则判断是发送者身份还是接收身份,然后根据不同的身份进行相应的处理,即发送广播消息或者接收广播消息;同样地,如果是多播,也惊醒身份的判断,然后作同样的处理.UDP 程序设计 公共模块 广播模块 多播模块初始化模块 用户帮助模块 参数获取模块 广播消息发送模块 广播消息接收模块 多播消息发送模块 多播功能控制模块 多播消息接收模块否是否是是 否是 不是 否 是 否图11.2 系统流程图3.广播消息发送流程图广播消息流程图如图11.3所示.程序首先创建UDP 套接字,如果创建成功则设置广播地址;由于进行的是广播机制,所以要将套接字时针为广播类型,即SO-BROADCAST;如果套接字选想不开设置成功则可以避免向指定的广播地址广播消息了.广播结束后(即达到最多的消息条数),关闭套接字,释放占用资源. 开始 初始化全局变获取参数设置接收广播消息 发送多播消息 初始化Winsock发送广播消息 接收多播消息成功? 广播? 发送? 发送?开始 成功?否是否是否 是是否图11.3 广播消息发送流程图开始创建UDP 套接字 设置广播地址选项 输出成功信息 输出错误信息 创建成功? 设置成功? 发送成功? 还可以发设置套接字 为广播类型 发送消息 到广播地址关闭套接字 释放占用资源 结束4. 广播消息接收流程图广播消息的接收流程如图11.4所示.程序首先创建UDP 套接字,如果创建成功则设置本地地址和广播地址,本地地址用于绑定套接字,广播地址是广播消息接收的地址.同发送广播消息一样,接收消息的套接字也要设置选项,不同的是,这里将套接字设置成可重用类型的,即SO-REUSEADDR,选项级别为SOL-SOCKET.这样一来,在相同的本地接口及端口上可以进行多次监听,即在同一台主机上,可以启动多个消息接收端来接收广播消息,如果不设置这个选项,则在同一台主机上,只能启动一个消息接收端来接收消息.套接字选拔设置成功后,绑定本地地址与套接字,即可以从广播地址接收广播消息,如果接收的消息条数达到最大限制则结束程序,关闭套接字,释放占用资源.否是否是是图11.4 广播消息接收流程开始 结束创建UDP 套接字设置套接字为 可重用类型 设置本地地址选项 接收广播消息 清空缓冲区创建成设置广播地址选项 创建成 绑定套接字和 本地地址 输出接收的消息 还可以接关闭套接字 释放占用资源程序实现源码分析1.程序预处理程序预处理包括库文件的导入、头文件的加载、广播和常量定义以及广播全局变量和多播全局变量的定义。

/*加载库文件*/#pragma comment(lib,”ws2_32.lib”)/*加载头文件*/#include<winsoke2.h>#include<ws2tcpip.h>#include<stdio.h>#include<stdlib.h>/*定义多播常量*/#define MCASTADDR “224.3.5.8”#define MCASTPORT 25000#define BUFSIZE 1024#define MCOUNT 10/*定义广播常量*/#define BCSTPORT 5050#defince BCOUNT 10/*定义广播全局变量*/SOCKET socketBro;SOCKET socketRec;struct sockaddr_in addrBro;struct sockaddr_in addrRec;BOOL broadSendFlag;BOOL bloadFlag;DWORD bCount;DOWRD bcastAddr;Short bPort;/*定义多播全局变量*/SOCKET socketMul;SOCKET socketJion;struct sockaddr_in addrLocal;struct sockaddr_in addrMul;BOOL multiSendFlag;BOOL bLoopBack;BOOL multiFlag;DWORD dwInterface;DWORD dwMulticastGroup;DWORD mCount;Short mPort;/*自定义函数*/void initial();void GetArgments(int argc, char **argv);void userHlepAll();void userHlepBro();void userHlepMul();void broadcastSend();void broadcastRec();void multControl(0;void multicastSend();void multicastRec();2.初始化模块初始化模块用于为广播全局变量和多播全局变量赋处始值,由initial(0函数实现。

Void initial(){/*初始化广播全局变量*/bPort=BROAFDCAST;bCount=BCOUNT;bcastAddr=INADDR_BROADCAST;brastSendFlag=FALSE;multiFlag= FALSE;/*初始化多播全局变量*/dwInterface=INADDR_ANY;dwMulticastGroup=inet_addr(MCASTADDR);mPort=MCASTADDR;mCount=MCOUNT;MmultisendFalg=FALDE;bLoopBack=FALSE;}3.参数获取模块参数获取模块用于获取用户提供的选项,包括全局选项(即广播和多播选择选项)、广播选项和多播选项,该模块由GetArgment()函数实现。

/*参数获取函数*/Void GetArgment(int argc,char **argv){Int i;/*如果参数个数小于2个*/If(argc<=1){userHelpAll();return;}/*获取广播选项*/If(argv[1][0]==’-‘&&argv[1][1]==’b’){/*gu广播标志设置为真*/broadFalg=TURE;for(i=2;i<argc;i++){if(argv[i][0]==’-‘){Switch(tolower(argv[i][1])){?/*如果是发送者*/Case’s’:broadsendFlag=TURE;break;/*广播的地址*/Case’h’:If(strlen(argv[i]>3)bcastAddr=inet_(&argv[i][3];Break;/*广播的端口号*/Case’p’;ifstrlen(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 < argc ;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;}/*全局用户帮助函数*/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.广播消息发送模块广播消息发送模块实现广播消息的发送功能,即在指定广播地址和端口上发送指定数量的消息。

相关主题