c语言udp通讯完整程序加讲解20页_第1页
c语言udp通讯完整程序加讲解20页_第2页
c语言udp通讯完整程序加讲解20页_第3页
c语言udp通讯完整程序加讲解20页_第4页
c语言udp通讯完整程序加讲解20页_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

UDP 程序设计 信息简介 :UDP 协议,即拥护数据报协议(Use Datagram Protocol).是一个简单的面向数据报的传输层协 议.他不提供可靠性,即只把应用程序传给 IP 层的数据发送出去,但是并不能保证他们能到达目的.广播和多播是基于 UDP 协议的两种消息发送机制.广播数据即从一个工作站发出,局域网内的其他所有工作站都能收到它.IP 协议下,多 播是广播的一种变形,IP 多播要求将对收发数据感兴趣的所有主机加入到一个特定的组. 设计目的 : 本章实现的程序即有广播的功能又有多播的功能 ,能实现基本的广播和多播机制,其主 要包括如下功能. 1) 提供广播机制. (1) 能设定身份,即是广播消息发送者还是接收者,默认是消息接收者 . (2) 能在默认的广播地址和端口号上发送广播消息,接收广播广播消息 . (3) 能指定广播地址,端口号,发送( 或接收)数量选项进行广播消息的发送和接收. 2) 提供多播机制 (1) 能制定身份,即是多播消息发送者好事接收者,默认是消息接收者 . (2) 主机能加入一个指定多播组. (3) 能以默认选项发送多播消息.接收多播消息. (4) 能指定多播地址,本地接口地址,端口号,发送(或接收)数量和数据反还标志选项进行多播消息的发送和接 收. 总体设计 功能模块设计 1.功能模块图 本程序有 3 大部分组成,即广播模块,多播模块部分,如图 11.1 所示.其中公共模块和多播模块共享的部分,包 括初始化模块,参数获取模块和用户帮助模块; 广播模块包括广播消息模块; 多播模块包括多播功能控制模块,多播消 息发送模块和多播消息接收模块. 2 图 11.1 功能模块图 1) 公共模块 (1) 初始化模块.该模块主要用于初始化全局变量,为全局变量赋初始值 . (2) 参数获取模块.该模块用于获取用户提供的参数,包括获取广播参数 ,多播参数和区分广播与多播 公共参数等. (3) 用户帮助模块.该模块应于显示用户帮助,包括显示公共帮助 ,广播帮助和多播帮助. 2) 广播模块 (1) 广播消息发送模块.该模块用于现实在指定广播地址和端口发送指定数量的广播消息 . (2) 广播消息接收模块.该模块用于现实在指定广播地址和端口接收指定数量的广播消息 . 3) 多播模块 (1) 多播功能控制模块.该模块用于现实多播套接字的创建和绑定 ,多播地址的设定,多播数据的设置, 数据反还选项的设置,以及多播组的加入等. (2) 多拨消息发送模块.该模块用于现实在指定多播组发送多播消息 . (3) 多播消息接收模块.该模块用于现实在指定多播组接收多波消息 . 2. 系统流程图 系统流程图如图 11.2 所示.程序首先初始化全局变量,包括广播(多播) 地址,端楼号,发送(接收)消息数量 等,然后花圈用户提供的参数,并初始化 Winsock 初始也成功则判断是进行广播还是多播程序;如果是广播, 则判断是发送者身份还是接收身份,然后根据不同的身份进行相应的处理,即发送广播消息或者接收广播消 息;同样地,如果是多播,也惊醒身份的判断 ,然后作同样的处理 . UDP 程序设计 公共模块 广播模块 多播模块 初 始 化 模 块 用 户 帮 助 模 块 参 数 获 取 模 块 广 播 消 息 发 送 模 块 广 播 消 息 接 收 模 块 多 播 消 息 发 送 模 块 多 播 功 能 控 制 模 块 多 播 消 息 接 收 模 块 3 否 是 否 是 是 否 是 不是 否 是 否 图 11.2 系统流程图 3.广播消息发送流程图 广播消息流程图如图 11.3 所示.程序首先创建 UDP 套接字,如果创建成功则设置广播地址;由于进行 的是广播机制,所以要将套接字时针为广播类型,即 SO-BROADCAST;如果套接字选想不开设置成功则 可以避免向指定的广播地址广播消息了.广播结束后(即达到最多的消息条数), 关闭套接字,释放占用资源. 开始 初始化全局变 量 获取参数设置 标记 接收广播消息 发送多播消息 初始化 Winsock 发送广播消息 接收多播消息 成功? 广播? 发送?发送? 开始 成功? 4 否 是 否 是 否 是 是 否 图 11.3 广播消息发送流程图 开始 创建 UDP 套接字 设置广播地址选项 输出成功信息 输出错误信息 创建成功? 设置成功? 发送成功? 还可以发送? 设置套接字 为广播类型 发送消息 到广播地址 关闭套接字 释放占用资源 结束 5 4. 广播消息接收流程图 广播消息的接收流程如图 11.4 所示.程序首先创建 UDP 套接字,如果创建成功则设置本 地地址和广播地址,本地地址用于绑定套接字,广播地址是广播消息接收的地址.同发送广播 消息一样,接收消息的套接字也要设置选项,不同的是,这里将套接字设置成可重用类型的,即 SO-REUSEADDR,选项级别为 SOL-SOCKET.这样一来,在相同的本地接口及端口上可以进 行多次监听,即在同一台主机上,可以启动多个消息接收端来接收广播消息,如果不设置这个 选项,则在同一台主机上,只能启动一个消息接收端来接收消息.套接字选拔设置成功后,绑定 本地地址与套接字,即可以从广播地址接收广播消息,如果接收的消息条数达到最大限制则结 束程序,关闭套接字,释放占用资源. 否 是 否 是 是 图 11.4 广播消息接收流程 开始 结束 创建 UDP 套接字 设置套接字为 可重用类型 设置本地地址选项 接收广播消息 清空缓冲区 创建成功? 设置广播地址选项 创建成功? 绑定套接字和 本地地址 输出接收的消息 还可以接收? 关闭套接字 释放占用资源 6 程序实现 源码分析 1.程序预处理 程序预处理包括库文件的导入、头文件的加载、广播和常量定义以及广播全局变量和多播 全局变量的定义。 /*加载库文件*/ #pragma comment(lib,”ws2_32.lib”) /*加载头文件*/ #include #include #include #include /*定义多播常量*/ #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; /*自定义函数*/ 7 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(argc3) bcastAddr=inet_( Break; /*广播的端口号*/ Casep; ifstrlen(argvi3) bPort=atoi( break; ? /*广播(接收或者发送)的数量*/ Case n; bCount=atoi( break; /*其他情况显示用户帮助,终止程序*/ Default; userHelpBro(); ExitProcess(-1); Break; return; /*获取多播选项*/ if(argv10=- 9 for(i=2; i 3) dwMulticastGroup = inet_addr( break; /*本地接口地址*/ case i: if (strlen(argvi) 3) dwInterface = inet_addr( break; /*多播端口号*/ case p: if (strlen(argvi) 3) mPort = atoi( break; /*环回标志设置为真*/ case l: bLoopBack = TRUE; break; /*发送(接收)的数量*/ case n: mCount = atoi( break; /*其他情况,显示用户帮助,终止程序*/ default: userHelpMul(); break; return; 10 /*全局用户帮助函数*/ void userHelpAll() printf(“Please choose broadcast-b or multicast-m !n“); printf(“userHelpAll: -b -sp-h-n | -m-s-h-p-i-l-nn“); userHelpBro(); userHelpMul(); /*广播用户帮助函数*/ void userHelpBro() printf(“Broadcast: -b -s:str -p:int -h:str -n:intn“); 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 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:intn“); printf(“ -m Start the multicast program.n“); printf(“ -s Act as server (send data); otherwisen“); printf(“ receive 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 usen“); printf(“ The default port is: %dn“, MCASTPORT); printf(“ -i:str Local interface to bind to; by default n“); printf(“ use INADDRY_ANYn“); printf(“ -l Disable loopbackn“); printf(“ -n:int Number of messages to send/receiven“); ExitProcess(-1); 11 5.广播消息发送模块 广播消息发送模块实现广播消息的发送功能,即在指定广播地址和端口上发送指定数 量的消息。该模块由函数 broadcastSend()来实现,其实现流程可参见图 11.3.该函数需要 接收选项“-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:%dn“,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 *) closesocket(socketBro); WSACleanup(); return; /*循环发送消息*/ while(in“, recvbuf,inet_ntoa(from.sin_addr); /*关闭套接字、释放占用资源 */ closesocket(socketMul); WSACleanup(); 18 10、主函数 主函数实现 Winsock 的初始化、广播与多播的选择以及发送者与接收者身份选择等功 能,其实现流程可参见图 11.2。 /*主函数*/ int main(int argc, char *argv) WSADATA wsd; initial(); GetArgments(argc, argv); /*初始化 Winsock*/ if (WSAStartup(MAKEWORD(2, 2), return -1; /*如果是执行广播程序*/ if(broadFlag) /*以发送者身份发送消息 */ if(broadSendFlag) broadcastSend(); return 0; /*以接收者身份接收消息 */ else broadcastRec(); return 0; /*如果是执行多播程序*/ if(multiFlag) /*以发送者身份发送消息 */ if(multiSendFlag) multicastSend(); return 0; 19 /*以接收者身份接收消息 */ else multicastRec(); return 0; return 0; 提示:由于在 TC 或者 Win-TC 中没有编译套接字的头文件,所以该程序需要在 Visual C+ 或者具有 Winsock 头文件的编译器中编译。本章程序已经在 Visual C+ 6.0 中通过编译。 11.4.2 运行结果 本节将测试程序的运行,主要包括测试不带选项启动服务、以默认选项启动广播发送 和接收端、以指定选项启动广播发送和接收端、以默认选项启动多播发送和接收端、以默 认选项启动多播接收和发送接收端。 1、不带选项启动服务 程序运行时,至少要带一个选项(“-m” (指示多播)或“-b” (指示广播) ) ,如 果没有带选项,则程序终止并显示所有的用户帮助,如图 11.6 所示。图 11.6 中,显示了全 局用户帮助、广播用户帮助和多播用户帮助。 11.4.2 运行结果 本节将测试程序的运行,主要包括测试不带悬想启动服务,以默认选项启动广播发送和 接收端,以指定选项启动广播发送和接受端,以默认选项启动多播发送和接收端,以默认 选项启动多播接受和发送接收端。 1.不带选项启动服务 程序运行时,至少要带一个选项(“-m” (指示多播)或“-b” (指示多播) ) ,如果 没有带选项,则程序终止并显示所有的用户帮助,如图 11.6 所示。图 11.6 中,显示了全局 用户帮助,广播用户帮助和多播用户帮助。 2.广播测试 广播测试主要包括带错误选项启动广播,以默认选项启动广播发送端接收端及以指 定选项启动广播发送端和接收端。 1) 带错误选项启动广播 如果在广播中提供了错误的选项,册程序会终止并显示广播用户帮助。如图 11.7 所示 广播中没有提供“-a”选项,所以程序会终止并会显示广播用户帮助。 2) 以默认选项启动广播 以默认 启动广播,即广播地址是 “INADDR-BROADCAST”,端口号是“5050” ,发 送 10 条信息。如图 11.8 所示,其中“-”表示是发送者身份。 在另一台主机启动广播发送端,如图 11.10 所示,指定的广播地址是 “202.204.53.255”(表示在“202.204.53”这个网段进行广播) ,端口号是“9999” ,发送 数量为 8 条。在图 11.10 中,显示了 8 条消息(消息 07) 。 如果在另一个主机上,在全 1 的广播地址上(端口号仍是“9999” )接收广播消息, 20 仍然能

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论