UDP文件传输实训报告_第1页
UDP文件传输实训报告_第2页
UDP文件传输实训报告_第3页
UDP文件传输实训报告_第4页
UDP文件传输实训报告_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、报告编号:课程设计报告基于UDP协议的文件传输系统的设计与实现 学生姓名: 指导教师: 所 在 系: 所学专业: 年 级: 2012 年 6 月目录摘要·····································&#

2、183;···································3第1章 设计内容及要求1.1 设计题目···········

3、··················································

4、41.2 设计任务及要求················································

5、·······4第2章 设计思路及框图2.1 设计思路·······································

6、3;·····················52.2 设计框图···························&

7、#183;·································5第3章 设计相关资料3.1 传输的可靠性············

8、3;············································63.2 用户数据报协议···

9、3;·················································

10、3;·63.3 winsock控件··············································&#

11、183;···········63.4 winsock控件重要属性、方法、事件··································&#

12、183;···7第4章 实验程序·············································

13、;················9第5章 实验总结································&#

14、183;···························14参考文献·····················&#

15、183;··············································15附 录··

16、83;·················································

17、83;···············16基于UDP协议的文件传输系统的设计与实现摘要随着计算机网络的迅速发展,人们的生活越来越离不开网络,如今网络编程已成为计算机发展的热点。本次实训用的是Winsock控件,提供了访问TCP/IP网络的捷径,只要设置好相应的属性和触发事件后的处理,就可以实现计算机之间的数据通信。Winsock控件实现两台计算机间的文件传输,描述了Winsock控件的使用方法及有关文件传输的算法。本次实训所编制的程序既有C/S模式

18、中服务端的功能,也有C/S模式中客户端的功能。因此而实现只要双方各打开一个程序就能实现文件的发送与接收。关键词 : Winsock控件;网络编程;文件传输;UDP第1章 设计内容及要求1.1 设计题目基于UDP协议的文件传输系统1.2 设计任务及要求综合以前所学的程序设计语言和现修的计算机网络等课程,掌握计算机网络技术的基本概念,并能将基本概念与具体实现技术相结合。基于UDP协议设计实现文件传输,程序有以下两个优点:1.使用了UDP协议,因此传输文件速度快。 2.操作形式多样且简便,可以充分满足客户自身的个性化要求。 程序基于VB提供的Winsock控件实现其功能,winsock控件提供了访问

19、TCP/IP网络的捷径,使用它可以不必了解TCP/IP的细节和调用Winsock的API函数,只要设置好相应的属性和触发事件后的处理,就可以实现计算机之间的数据通信。第2章 设计思路及方框图2.1 设计思路本程序使用了六个winsock控件并将其分成三组,分别用作实现自动搜索在线主机、实现文件的可靠传输、实现文件传输中的控制。其中自动搜索在线主机功能是用一个winsock控件以广播方式发送本机IP地址,对方接收并保存在列表之中以显示;文件的可靠传输功能是用winsock控件来对每一个数据包进行标号,再由对方的winsock控件解包读取后进行比对,出错则重发,以此来保证消除UDP文件传输中常出现

20、的丢包现象;而文件传输控制的功能则由一对winsock控件来实现,用来传输文件名、文件长度、文件传输结束命令、取消命令等句柄,并由接收方进行实际的操作。2.2 设计方框图简要功能:开始载入用户名信息结束初始化(设置IP、端口号、定时器值、窗体中的显示文字)提取包文件数据、写入文件打开文件,选择文件接收方分包、加入包序号、封包解包、提取包序号并比对发送比对错误,请求重发第3章 设计相关资料3.1传输的可靠性 由于UDP文件传输常常发生丢包的现象,于是在本程序中打包时为每一个包都标上了序号,在进行文件传输的同时,程序会有一个变量同时改变以符合包中的序号,如果接受的包中的序号与之不相等则程序会向发送

21、方发送重发请求,发送方接收到请求后会重发数据包知道接受到接收方的确认信息为止。程序通过这种方法避免了UDP的丢包缺陷。3.2 UDP协议 该实验文件传输是在UDP协议下进行的,UDP提供无连接不可靠的用户数据包传输。其中每一个数据段只有8Byte相对于TCP传输开销较少,且无须对发送速率进行管理。UDP发送数据的速率仅仅受限于程序产生数据的速率,信源主机的性能及internet上可以利用的宽带。并且与TCP不同的是UDP不需要连接,可直接发送,传输数据较快,但同时其稳定性不好,易丢包。3.3 Winsock控件Winsock即Windows Sockets规范的简称,是目前最流行的网络通信应用

22、程序接口之一。所谓Socket,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。Winsock控件工作在传输层上,在这一层上,目前主要流行的协议包括TCP和UDP两种:TCP协议适用于那些对于数据的可靠性要求比较高的情况,目前大多数的网络应用层协议都是基于TCP协议的(例如常用的HTTP、FTP、SMTP、POP3等协议);UDP协议适用于对数据可靠性要求不高而对速度要求较

23、高的情况。3.4 Winsock控件重要属性、方法和事件(1) 属性Protocol:通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。可选的协议是TCP和UDP,对应的VB中常量分别是sckTCPProtocol和sckUDPProtocol,Winsock控件默认协议是UDP。RemoteHostIP:返回远程计算机的IP地址。本实验使用的是UDP协议,那么当DataArrival事件后,发送UDP报文的计算机的IP才赋给了这个属性。如果是TCP协议,在客户端,当使用了控件的Connect方法后,远程计算机的IP地址就赋给了RemoteHostIP属性,而在服务器

24、端,当ConnectRequest事件后,远程计算机(客户端)的IP地址就赋给了这个属性。ByteReceived:返回当前接收缓冲区中的字节数。State:用于返回当前WinSock控件的状态。如表所示:常数值描述sckClosed0缺省值,关闭SckOpen1打开SckListening2侦听(TCP)sckConnectionPending3连接挂起(TCP)sckResolvingHost4识别主机sckHostResolved5已识别主机sckConnecting6正在连接(TCP)sckConnected7已连接(TCP)sckClosing8同级人员正在关闭连接(TCP)sckE

25、rror9错误(2) 方法Bind:用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序能再使用这个端口。Listen:只在使用TCP协议时有用。它将应用程序置于监听检测状态。Connect:当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法。Accept:当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。SendData:连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数。GetData:当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData方法。PeekData:和Get

26、Data方法类似,但PeekData在取得数据后并不把缓冲区清空。(3) 事件ConnectRequest:(TCP)本地计算机接收到远程计算机发送的连接请求时,ConnectRequest事件将会被触发。SendProgress:当一端的计算机正在向另一端的计算机发送数据时,SendProgress事件将被触发。 SendProgress事件记录了当前状态下已发送的字节数和剩余字节数。SendComplete:当所有数据发送完成时,被触发。DataArrival:当建立连接后,接受到了新数据就会触发这个事件。注意:如果在接受到新数据前,缓冲区中非空,就不会触发这个事件。Error:当在工作中

27、发生任何错误都会触发这个事件。第4章 实验程序Account窗体:实际运行:这是程序运行后的登录窗体。如果已经设置过用户名则直接将之显示在文本框中,如果没有则等待用户输入用户名,点击确定按钮后保存到程序路径的accountname.Ini文件中并隐藏本窗体载入main窗体。Main窗体:实际运行:这是程序的主窗体。其中的Timer控件会每过0.8秒向全网发送一次本机IP以便让其他用户程序将本机加入其在线列表。清空按钮用于清除发送文件列表中的内容并让发送按钮不可用以防止误操作。添加文件按钮用于添加文件,按下后会让此主窗体不可用并载入addfile窗体来添加文件。在线主机列表会显示所有在线的主机用

28、户名。退出按钮按下后会直接退出本程序。Addfile窗体:实际运行:本窗体用于打开文件并将之放入主窗体的发送列表中。选择驱动器、双击选择文件夹、双击选择文件后会将其路径载入到已选文件列表中,然后点击确定隐藏本窗体并使主窗体可用,此时路径会被载入到主窗体的待发送列表中。重置按钮用于清空已选文件列表。返回则不做任何操作返回主窗体并使主窗体可用。Hostbase窗体:实际运行:这是发送窗体。其中的两个winsock控件一个用于发送文件数据,一个用于发送控制数据。本窗体由主窗体中按下发送目标按钮触发载入,在载入的同时本窗体会读取存于主窗体中在线用户列表信息和待发送文件路径信息,双击本窗体中在线主机列表

29、中的一个用户名会将其复制到发送目标列表中,然后单击发送,程序就会开始发送文件并将发送进度显示在send_data窗体中。重置按钮用于清空发送目标列表中的信息。返回按钮则不作任何操作直接返回主窗体并使主窗体可用。Recieve窗体:实际运行:这是文件接收确认窗体。在有用户向本机发送文件时,本机就会弹出这个窗体以让用户决定是否接受发送者发送的文件,窗体中发送者用户名由本机获得的对方地址在主窗体中的在线用户列表中查找以获得并显示在本窗体的发送者文本框中,对方发送的文件的文件名可直接从发来的数据包中获得。如果用户点击接受按钮则程序会接受此次发送请求并开始接收文件数据,接收数据的进度会显示在随后弹出的r

30、ecieve_data窗体中。如果用户点击返回按钮,则程序会向发送方发送拒绝信息以中断文件数据的传输并返回主窗体且使主窗体可用。Recieve_data窗体:实际运行:这是数据接收状况窗体。本窗体用于显示文件的传输状况。取消按钮按下后程序会发送取消请求至发送方并删除已接收的数据,然后返回主窗体并使主窗体可用。Send_data窗体:实际运行:这是文件发送状况窗体。本窗体用于显示文件的发送状况。如果点击取消按钮则会向接收端发送取消通知,接收端收到这个消息后会删除已接收的数据文件并发回确认信息,发送端之后会返回主窗体且使主窗体可用。第5章 实验总结刚开始拿到题目时根本无从下手,后来通过老师的讲解,

31、知道我们这个实验可以通过Winsock控件来实现,大致了解了整个框架。但我们对控件的运用不是很清楚,于是去图书馆查阅相关资料、上网搜索相关知识,对Winsock控件有了一个基本的了解。于是慢慢去构思,一步一步去实现基于UDP的文件传输,并基本成功了。实验中我们了解到UDP传输文件的大小是有界限的,而这一问题可以通过数据拆包的方法来解决。 通过这一实验,我们了解到团队精神的重要性,同时强化了自己的动手能力和编程能力。对Winsock控件有了更进一步的了解,并基本学会了该控件的运用。也知道了文件传输的工作原理,同时也了解到数据库和计算机网络结合的重要性,对以后的从事这方面工作有着实际的意义。最后我

32、们也慢慢体会到解决一个难题是要有足够的耐心和毅力的,同时要具有足够的理知识和实际操作的能力,慢慢去积累这方面的经验是很有必要的。参考文献1 崔彦锋,许小荣.VB网络与远程控制编程实例教程M.北京:北京希望电子出版社,1996.34652 卞志强.Visual Basic网络程序设计M.北京:人民邮电出版社,1993.48933 肖斌,董磊.Visual Basic 6 网络编程实例教程M北京:北京希望电子出版社, 1998.471394 Loren Eidahl.Visual Basic控件设计与开发M.浙江:浙江科学技术出版社,1998.26895魏江江.Visual Basic API编程

33、百例通M.北京:科学出版社,2001.45786高春艳,刘彬彬. Visual Basic空件大全M.北京:人民邮电出版社,1991.1531附录:(部分控件的属性已在属性窗口中设置,不需再过程中初始化)Account窗体:Dim accountname As StringPrivate Sub Command1_Click() Dim str(2) As String Dim num(2) As Long If Len(Text1.Text) > 10 Then Exit Sub Else str(0) = Text1.Text str(1) = Len(str(0) For num(

34、0) = 0 To 10 If Len(str(0) < 11 Then str(0) = str(0) + str(1) End If Next num(0) End If Open accountname For Output As #2 Print #2, str(0) Close #2 account.Hide main.ShowEnd SubPrivate Sub Form_Load() Dim str As String accountname = App.Path & "accountname.ini" If Dir(accountname) &

35、lt;> "" Then Open accountname For Input As #1 Input #1, str Close #1 str = Mid(str, 1, Mid(str, 11, 2) Text1.Text = str Command1.Enabled = True Else Command1.Enabled = False Text1.Text = "" End IfEnd SubPrivate Sub Text1_Change() Command1.Enabled = TrueEnd SubMain窗体:Dim meip A

36、s StringDim str As StringDim remotehostip_string As StringDim filepath As StringDim filename As StringDim filelenth As StringDim i As LongDim Sign As BooleanDim numa As LongDim num_ok As LongPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any,

37、Source As Any, ByVal Length As Long)Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongConst LB_SETHORIZONTALEXTENT As Long = &H194Private Sub Command1_Click() addfile.Sho

38、w main.Enabled = FalseEnd SubPrivate Sub Command2_Click() If List1.ListCount = 0 Then Exit Sub End If hostbase.Show main.Enabled = FalseEnd SubPrivate Sub Command3_Click() Timer1.Enabled = False Winsock_sip.SendData "out" EndEnd SubPrivate Sub Command4_Click() List1.Clear Command2.Enabled

39、= FalseEnd SubPrivate Sub Form_Load() SendMessage List1.hwnd, LB_SETHORIZONTALEXTENT, 500, ByVal 0 SendMessage List2.hwnd, LB_SETHORIZONTALEXTENT, 300, ByVal 0 Dim FN As String FN = App.Path & "accountname.ini" Open FN For Input As #1 Input #1, str Close #1 Winsock_sip.RemoteHost = &qu

40、ot;55" Winsock_sip.RemotePort = 12345 Winsock_sip.LocalPort = 54321 Winsock_sip.Bind 54321 Winsock_rip.RemotePort = 54321 Winsock_rip.LocalPort = 12345 Winsock_rip.Bind 12345 Winsock_getdata.RemotePort = 3456 Winsock_getdata.LocalPort = 6543 Winsock_getdata.Bind 6543 Winsock_ret.Re

41、motePort = 6789 Winsock_ret.LocalPort = 9876 Winsock_ret.Bind 9876 Timer1.Interval = 800 Timer1.Enabled = True Command2.Enabled = FalseEnd SubPrivate Sub Timer1_Timer() Winsock_sip.SendData strEnd SubPrivate Sub Winsock_getdata_DataArrival(ByVal bytesTotal As Long) Dim Datas() As Byte Dim Choose As

42、Long Dim Ndata() As Byte ReDim Datas(bytesTotal) Winsock_getdata.GetData Datas If Sign = True Then ReDim Ndata(bytesTotal - 5) CopyMemory Choose, Datas(bytesTotal - 4), 4 If Choose = numa Then CopyMemory Ndata(0), Datas(0), bytesTotal - 4 Put #2, , Ndata numa = numa + 1 num_ok = num_ok + bytesTotal

43、- 4 recieve_data.ProgressBar1.Value = num_ok Winsock_ret.SendData "next" Else Winsock_ret.SendData "resend" End If Else recieve_data.Label2.Caption = "正在接收" filelenth = "" For i = 0 To bytesTotal - 1 filelenth = filelenth + Chr(Datas(i) Next i Sign = True reci

44、eve_data.ProgressBar1.Max = Val(filelenth) recieve_data.ProgressBar1.Min = 0 Winsock_ret.SendData "get" End IfEnd SubPrivate Sub Winsock_ret_DataArrival(ByVal bytesTotal As Long) Dim control As String Winsock_ret.GetData control If control = "end" Then Close #2 Sign = False num_o

45、k = 0 recieve_data.Command1.Caption = "完成" recieve_data.Label2.Caption = "接收完毕!" Exit Sub End If If control = "clr" Then Close #2 num_ok = 0 Kill filepath recieve_data.Hide End If recieve_data.Label2.Caption = "准备接收" filepath = App.Path & control recieve.L

46、ist1.AddItem control recieve.Label3.Caption = filepath recieve.ShowEnd SubPrivate Sub Winsock_rip_DataArrival(ByVal bytesTotal As Long) Dim information As String Dim Sign As String Dim i As Long Winsock_rip.GetData information If information = "out" Then For i = 0 To List2.ListCount - 1 If

47、 Winsock_rip.RemoteHostIP = Mid(List2.List(i), 21) Then List2.RemoveItem i Exit Sub End If Next i End If information = Mid(information, 1, Mid(information, 11, 2) For i = 0 To 20 If Len(information) < 20 Then information = information + " " End If Next i information = information + Wins

48、ock_rip.RemoteHostIP If List2.ListCount = 0 Then List2.AddItem information Else For i = 0 To List2.ListCount - 1 If information = List2.List(i) Then Exit Sub End If Next i List2.AddItem information End IfEnd SubAddfile窗体:Dim total_path As StringPrivate Declare Function SendMessage Lib "user32&q

49、uot; Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongConst LB_SETHORIZONTALEXTENT As Long = &H194Private Sub Command1_Click() Dim list1_num As Long main.List1.Clear For list1_num = 0 To List1.ListCount If List1.List(list1_num) &

50、lt;> "" Then main.List1.AddItem List1.List(list1_num) Next list1_num List1.Clear addfile.Hide main.Enabled = True If List1.List(0) = "" Then main.Command2.Enabled = True If main.List1.ListCount <> 0 Then main.Command2.Enabled = TrueEnd SubPrivate Sub Command2_Click() Lis

51、t1.ClearEnd SubPrivate Sub Form_Load() SendMessage List1.hwnd, LB_SETHORIZONTALEXTENT, 500, ByVal 0 main.List1.ClearEnd SubPrivate Sub Command3_Click() addfile.Hide main.Enabled = TrueEnd SubPrivate Sub Dir1_Change() File1.Path = Dir1.Path dir_path = Dir1.PathEnd SubPrivate Sub Drive1_Change() Err.C

52、lear On Err GoTo Line1 Dir1.Path = Drive1.Drive Dim ret As IntegerLine1: If Err.Number = 68 Then ret = MsgBox("驱动器没有准备好!", vbRetryCancel, "警告") If ret = vbRetry Then Dir1.Path = Drive1.Drive Else: Resume Next End If End IfEnd SubPrivate Sub File1_DblClick() total_path = File1.Pat

53、h + "" + File1.filename Dim num As Long Dim num2 As Long For num = 0 To File1.ListCount If List1.List(num) = total_path Then num2 = num2 + 1 Next num If num2 = 0 Then List1.AddItem total_pathEnd SubPrivate Sub List1_DblClick() List1.RemoveItem List1.ListIndexEnd SubHostbase窗体:Private Decla

54、re Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongConst LB_SETHORIZONTALEXTENT As Long = &H194Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (

55、Destination As Any, Source As Any, ByVal Length As Long)Dim filenum As LongDim strstr As StringDim numbers As LongDim sum As LongPrivate Sub Command1_Click() If List2.ListCount = 0 Then Exit Sub Else send_data.Label2.Caption = main.List1.List(fielname) send_data.Label3.Caption = "准备发送" sen

56、d_data.Command1.Caption = "取消" send_data.Show Winsock_control.RemoteHost = Mid(List2.List(0), 21) Winsock_senddata.RemoteHost = Mid(List2.List(0), 21) Winsock_control.SendData Mid(List3.List(0), InStrRev(List3.List(0), "") Timer1.Interval = 20000 Timer1.Enabled = True sum = 0 End

57、 IfEnd SubPrivate Sub Command2_Click() List2.ClearEnd SubPrivate Sub Command3_Click() List2.Clear hostbase.Hide main.Enabled = TrueEnd SubPrivate Sub Form_Load() SendMessage List3.hwnd, LB_SETHORIZONTALEXTENT, 800, ByVal 0 Dim i As Long For i = 0 To main.List2.ListCount - 1 List1.AddItem main.List2.

58、List(i) Next i For i = 0 To main.List1.ListCount - 1 List3.AddItem main.List1.List(i) Next i Winsock_senddata.RemotePort = 6543 Winsock_senddata.LocalPort = 3456 Winsock_senddata.Bind 3456 Winsock_control.RemotePort = 9876 Winsock_control.LocalPort = 6789 Winsock_control.Bind 6789 Command1.Enabled =

59、 FalseEnd SubPrivate Sub List1_DblClick() Dim str As String Dim i As Long str = List1.List(List1.ListIndex) If List2.ListCount = 0 Then List2.AddItem str Command1.Enabled = True Else For i = 0 To List2.ListCount - 1 If str = List2.List(i) Then Exit Sub End If Next i List2.AddItem str Command1.Enable

60、d = True End IfEnd SubPrivate Sub List2_DblClick() List2.RemoveItem List2.ListIndex Command1.Enabled = FalseEnd SubPrivate Sub Timer1_Timer() Timer1.Enabled = False MsgBox "等待超时!", 0, "提示"End SubPrivate Sub Winsock_control_DataArrival(ByVal bytesTotal As Long) Dim bag() As Byte D

61、im tbag() As Byte Dim ret As String Static filelen As Long Static file_sended As Long Winsock_control.GetData ret Select Case ret Case "len" Timer1.Enabled = False Open List3.List(0) For Binary As #1 filelen = LOF(1) send_data.ProgressBar1.Max = filelen send_data.ProgressBar1.Min = 0 Winso

62、ck_senddata.SendData str(filelen) Case "get" send_data.Label3.Caption = "正在发送" If filelen < 4092 Then If filelen = 0 Then send_data.Label3.Caption = "发送成功!" send_data.Command1.Caption = "完成" Winsock_control.SendData "end" sum = 0 send_data.Progres

63、sBar1.Value = filelen Close #1 Else ReDim tbag(1 To filelen) Get #1, , tbag ReDim bag(1 To filelen + 4) CopyMemory bag(1), tbag(1), filelen CopyMemory bag(filelen + 1), sum, 4 Winsock_senddata.SendData bag sum = sum + 1 file_sended = filelen send_data.ProgressBar1.Value = file_sended End If Else ReDim tbag(1 To 4092) Get #1, , tbag ReDim bag(1 To 4096) CopyMemory bag(1), tbag(1), 4092 CopyMemory bag(4093), sum, 4 Winsock_senddata.SendData bag sum = sum + 1 file_sended = 4092

温馨提示

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

评论

0/150

提交评论