【测控技术与仪器】udp文件传输-有源码_第1页
【测控技术与仪器】udp文件传输-有源码_第2页
【测控技术与仪器】udp文件传输-有源码_第3页
【测控技术与仪器】udp文件传输-有源码_第4页
【测控技术与仪器】udp文件传输-有源码_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

UDP本身是一种无连接的协议。它只管发送,而不需要知道,发送的包是不是准确的到达了目的地。所以它具有发送效率高的特点,同时也具有丢包的弱点。但如果对UDP加一些验证和重发机制,就能很大程度上避免丢包的情况,达到稳定的传输。同时,此种方式的传输速度会比TCP方式的传输快很多。以下是一种串行的带验证重发机制的UDP传输文件,源代码,CLIENT负责发文件,SERVER负责接文件。希望对大家有帮助。程序中,发送的包是自己定义的,这样除了可以将需要发送的数据发送过去外,还可以将一些控制信息发过去。SERVER端INCLUDEINCLUDEINCLUDEINCLUDEINCLUDEPRAGMACOMMENTLIB,“WS2_32LIB“DEFINEPORT8000DEFINESERVER“1921681211“SOCKETSOCKINTSENDEXIT0/控制发送线程状态的全局变量INTRECVEXIT0/控制接收程状态的全局变量INTFILESIZE1/记录文件大小的全局变量INTRECVSIZE0/记录文件大小的全局变量INTID1SOCKADDR_INSERVERINTLENSIZEOFSERVERSTRUCTBAOHEAD/包头INTSIZEINTIDINTRECVSIZETYPEDEFBAOHEADELEMTYPEBAOHEADDATAHEADSTRUCTRECVBUF/包格式ELEMTYPEHEAD/包头CHARBUF1024/存放数据的变量INTBUFSIZE/存放数据长度的变量STRUCTRECVBUFDATADWORDWINAPIRECVFUNCLPVOIDLPPARAM/接收线程INTMAINWSADATAWSADATAWSASTARTUPMAKEWORD2,2,SOCKSOCKETAF_INET,SOCK_DGRAM,0/建立SOCKETIFSOCKSOCKET_ERRORPRINTF“SOCKET创建失败N“RETURN0SOCKADDR_INADDRADDRSIN_FAMILYAF_INETADDRSIN_PORTHTONSPORTADDRSIN_ADDRS_ADDRINET_ADDRSERVERINTNRESULTBINDSOCK,SOCKADDR/绑定SOCKETIFNRESULTSOCKET_ERRORPRINTF“绑定SOCKET有问题N“RETURN0ELSEPRINTF“服务启动成功N“DWORDIDHANDLEHANDLECREATETHREADNULL,0,RECVFUNC,0,0,/创建接收线程INTI0IFRECVEXIT1/PRINTF“BUFSIZEDN“,DATABUFSIZEFWRITEDATABUF,SIZEOFCHAR,DATABUFSIZE,FPRECVSIZERECVSIZEDATABUFSIZE/记录新的接收到的文件长度/PRINTF“RECVSIZEDN“,RECVSIZEFILESIZEDATAHEADSIZEDATAHEADIDDATAHEADIDDATAHEADRECVSIZERECVSIZEDATAHEADSIZEFILESIZEINTDSENDTOSOCK,CHAR/发送收到数据的确认包IFD0/PRINTF“发送收到数据包的确认信息成功N“IDID1ELSEIFDATAHEADID0/PRINTF“发送收到数据包的确认信息成功N“IFFILESIZERECVSIZE/如果接收到的文件长度等于文件大小,/等发送一个确认包告诉发送端文件已接收完成,并退出自己的接收线程DATAHEADIDDATAHEADIDDATAHEADRECVSIZE1DATAHEADSIZEFILESIZEPRINTF“FILESIZEDN“,FILESIZEPRINTF“RECVSIZEDN“,RECVSIZEPRINTF“文件接收完成N“INTDSENDTOSOCK,CHARSENDEXIT2RECVEXIT2BREAKFCLOSEFPRECVEXIT2RETURN0CLIENT端INCLUDEINCLUDEINCLUDEINCLUDEINCLUDEPRAGMACOMMENTLIB,“WS2_32LIB“DEFINESERVER“1921681211“STRUCTBAOHEAD/包头格式INTSIZEINTIDINTRECVSIZETYPEDEFBAOHEADELEMTYPESTRUCTSENDBUF/数据包格式ELEMTYPEHEAD/包头CHARBUF1024/存放数据的变量INTBUFSIZE/存放本包存放数据的BUF变量的长度的变量。STRUCTSENDBUFDATADWORDWINAPISENDFUNCLPVOIDLPPARAM/发送线程DWORDWINAPIRECVFUNCLPVOIDLPPARAM/街收线程SOCKETSOCKINTSENDEXIT0/控制发送线程状态的全局变量INTRECVEXIT0/控制接收线程状态的全局变量INTFILESIZE0/记录文件大小的全局变量INTRECVSIZE0/返回已接收文件大小的全局变量SOCKADDR_INSERVERINTLENSIZEOFSERVERINTSENDID0/发送IDINTRECEIVEID0/接收IDHANDLEHEVENT/句炳INTMAINHEVENTCREATEEVENTNULL,FALSE,FALSE,NULL/创建一个事件WSADATAWSADATAWSASTARTUPMAKEWORD2,2,SOCKSOCKETAF_INET,SOCK_DGRAM,0IFSOCKSOCKET_ERRORPRINTF“SOCKET创建失败N“RETURN0ELSEPRINTF“服务启动成功N“SERVERSIN_FAMILYAF_INETSERVERSIN_PORTHTONS8000/SERVER的监听端口SERVERSIN_ADDRS_ADDRINET_ADDRSERVER/SERVER的地址GETCHDWORDIDHANDLEHANDLECREATETHREADNULL,0,RECVFUNC,0,0,/创建接收线程INTI0IFRECVEXIT1DWORDDRETWAITFORSINGLEOBJECTHEVENT,500/发送完后,等待500毫秒。等待中如果等待的事件被激活,则马上返回。SWITCHDRETCASEWAIT_TIMEOUT/一段时间内没收到确认包,重发刚才的那个数据报SENDTOSOCK,CHAR/PRINTF“重新发送数据SN“,CHARBREAKDEFAULTBREAK/否则返回。FCLOSEFP1SENDEXIT2RETURN0DWORDWINAPIRECVFUNCLPVOIDLPPARAMRECVEXIT1/告诉主线程,接收线程已经启动。BAOHEADRECVBAOFD_SETFDREADWHILERECVEXIT1FD_ZEROFD_SETSOCK,TIMEVALVALVALTV_SEC60VALTV_USEC0INTRESULTSELECT0,/查看SOCKET是否可读IFRESULTSOCKET_ERRORBREAKIFRESULT0/不可读则马上返回。重新判断CONTINUEINTRECRECVFROMSOCK,CHAR/可读状态下接收数据报IFREC0/PRINTF“收到确认信息SN“,CHARRECVSIZERECVBAORECVSIZE/将接收大小传给全局变量RECEIVEIDRECVBAOID/记录此次接收到包的IDSETEVENTHEVENT/激活事件IFRECVBAORECVSIZE1/如果接收端发送接收完毕的信号,则发送,接收线程均自行退出,并显示发送文件完成SEN

温馨提示

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

评论

0/150

提交评论