计算机网络课程设计-利用VB实现FTP协议的基本功能.doc_第1页
计算机网络课程设计-利用VB实现FTP协议的基本功能.doc_第2页
计算机网络课程设计-利用VB实现FTP协议的基本功能.doc_第3页
计算机网络课程设计-利用VB实现FTP协议的基本功能.doc_第4页
计算机网络课程设计-利用VB实现FTP协议的基本功能.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

此文档收集于网络,如有侵权,请联系网站删除课程设计任务书专业:计算机科学与技术 学号:学生姓名(签名): 设计题目:VB实现FTP协议的基本功能一、设计实验条件 综合搂实验室二、设计任务及要求1. FTP协议可以使本地或远程的客户和服务器之间通过TCP传输协议进行文件传输;2. 要求利用VB实现FTP协议的基本功能。3. 用Winsock控件来实现与FTP服务器端建立连接,该程序实现下述命令功能:get:取远方的一个文件put:传给远方一个文件pwd:显示服务器当前目录dir:列出服务器当前目录cd:改变远方当前目录quit:退出返回4. 用Serv-U搭建FTP服务器,设置客户端访问的用户名、密码、可以访问的服务器目录,对服务器可访问目录文件的操作权限(可读、可写)。三、设计报告的内容1. 设计题目与设计任务(设计任务书)设计题目:实现FTP协议的基本功能,实现客户机和服务器之间文件的上传、下载、修改、重名名等设计任务:使用Winsock控件,通过TCP协议与FTP服务器端建立连接。使用的环境是Microsoft Visual Basic 6.0 中文版,FTP服务器搭建是基于Serv-U软件建立的服务器。2. 前言(绪论)(设计的目的、意义等)文件传输协议FTP(File Transfer Protocol)是在TCP/IP网络中传输文件的一种格式规范,其目标是保证主机之间可靠和高效的传输程序或数据,向用户屏蔽不同主机中各种文件存储系统的细节。其规定在用户和服务器之间建立两个并行的TCP连接:控制连接和数据连接。前者是建立在用户协议解释器和服务器协议解释器之间用于交换命令与响应的通信链路;后者是传输数据的全双工连接。数据连接要先将文件拆分成分组再进行传送,这样做的目的是为了更加好的适应网络中的带宽限制,以及减少传送期间节点的延时,以达到高速传送。文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。本设计是用VB语言简单实现文件传输协议,主要利用Winsock控件,当中实现了上传、下载、获取服务器目录等基本文件传输功能。 客户端服务器数据传输控制字传输3. 设计主体(各部分设计内容、分析、结论等)(1)建立基本的工程和窗口 实现“系统信息”功能。通过查询注册表来获取一些相关的信息,导入要用到的访问注册版的API, 通过填写服务器地址,用户名和用户密码来实现与服务器的连接。可以匿名访问也可以填写用户名访问。 下图:设计主窗口的菜单和其他一些必需的控件。如:工具栏、左边的TreeView控件、添加右边的ListView控件等。 服务器配置:设置用户有关信息 (2)基本类模块:用于处理相关链接、上传、下载等操作 1实现FTP文件类,即把有关的信息封装成一个类,实现面向对象的思想,便于管理Private mvarFileName As String Private mvarLastWriteTime As Date Private mvarFileSize As Long Private mvarIsDirectory As BooleanPrivate mvarFilePath As StringPublic Property Let IsDirectory(ByVal vData As Boolean) mvarIsDirectory = vDataEnd PropertyPublic Property Get IsDirectory() As Boolean IsDirectory = mvarIsDirectoryEnd PropertyPublic Property Let FileSize(ByVal vData As Long) mvarFileSize = vDataEnd PropertyPublic Property Get FileSize() As Long FileSize = mvarFileSizeEnd PropertyPublic Property Let LastWriteTime(ByVal vData As Date) mvarLastWriteTime = vDataEnd PropertyPublic Property Get LastWriteTime() As Date LastWriteTime = mvarLastWriteTimeEnd PropertyPublic Property Let FileName(ByVal vData As String) mvarFileName = vDataEnd PropertyPublic Property Get FileName() As String FileName = mvarFileNameEnd PropertyPublic Property Let FilePath(ByVal vData As String) mvarFilePath = vDataEnd PropertyPublic Property Get FilePath() As String FilePath = mvarFilePathEnd Property 2实现FTP连接类。定义两个Winsock控件变量,一个用户控制连接,一个用于数据连接*Winsock Control for control connectionPrivate WithEvents wscControl As MSWinsockLib.WinsockWinsock Control for data connectionPrivate WithEvents wscData As MSWinsockLib.Winsock*为wscControl添加DataArrival事件响应方法。通过调用GetData方法获取到达的数据,并加在原来的数据的后面,如果相应码是426,表示与服务器的连接关闭,重置类变量,并关闭wscControl。Private Sub wscControl_DataArrival(ByVal bytesTotal As Long) Dim strData As String wscControl.GetData strData m_strWinsockBuffer = m_strWinsockBuffer & strData m_strLastServerResponse = strData m_objTimeOut.Reset If GetResponseCode(strData) = 426 Then If m_bTransferInProgress Or m_bUploadFile Then wscData.Close Close m_intLocalFileID m_strDataBuffer = m_lDownloadedBytes = 0 m_lUploadedBytes = 0 m_bTransferInProgress = False m_bUploadFile = False m_bFileIsOpened = False End If wscControl.Close m_bBusy = False End If Debug.Print Left(strData, Len(strData) - 2)End Sub处理与FTP服务器的连接。用的FTP服务器需要用户名和密码进行帐户认证,需要先处理USER命令和PASS命令,获取用户名,附加到USER命令中发送到服务器。并处理服务器的响应,最后返回FTP相应码,标识登录是否成功。Private Function ProcessUSERCommand() As FTP_RESPONSE_CODES Dim strData As String On Error GoTo ProcessUSERCommand_Err_Handler RaiseEvent StateChanged(FTP_CONNECTION_AUTHENTICATION) m_strUserName = IIf(Len(m_strUserName) 0, m_strUserName, anonymous) If Len(m_strPassword) = 0 Then If m_strUserName = anonymous Then m_strPassword = Else raise error Exit Function End If End If wscControl.SendData USER & m_strUserName & vbCrLf Debug.Print USER & m_strUserName m_objTimeOut.StartTimer Do DoEvents If m_objTimeOut.Timeout Then m_LastError = ERROR_FTP_USER_TIMEOUT Exit Do End If If Len(m_strWinsockBuffer) RESPONSE_CODE_LENGHT Then strData = m_strWinsockBuffer m_strWinsockBuffer = Exit Do End If Loop m_objTimeOut.StopTimer Select Case GetResponseCode(strData) Case FTP_RESPONSE_USER_LOGGED_IN ProcessUSERCommand = FTP_RESPONSE_USER_LOGGED_IN Case FTP_RESPONSE_USER_NAME_OK_NEED_PASSWORD ProcessUSERCommand = FTP_RESPONSE_USER_NAME_OK_NEED_PASSWORD Case Else ProcessFtpResponse GetResponseCode(strData) End Select Exit_Label: Exit FunctionProcessUSERCommand_Err_Handler: If Not ProcessWinsockError(Err.Number, Err.Description) Then Err.Raise vbObjectError + 1000 + Err.Number, CFtpConnection.ProcessUSERCommand, Err.Description End If GoTo Exit_Label End FunctionPrivate Function ProcessPASSCommand() As FTP_RESPONSE_CODES Dim strResponse As String Dim strData As String On Error GoTo ProcessPASSCommand_Err_Handler wscControl.SendData PASS & m_strPassword & vbCrLf Debug.Print PASS & m_strPassword m_objTimeOut.StartTimer Do DoEvents If m_objTimeOut.Timeout Then m_LastError = ERROR_FTP_USER_TIMEOUT Exit Do End If If Len(m_strWinsockBuffer) RESPONSE_CODE_LENGHT Then strData = m_strWinsockBuffer Exit Do End If Loop m_objTimeOut.StopTimer If GetResponseCode(strData) = FTP_RESPONSE_USER_LOGGED_IN Then Do DoEvents If InStr(1, m_strWinsockBuffer, 230 ) 0 Then ProcessPASSCommand = FTP_RESPONSE_USER_LOGGED_IN m_strWinsockBuffer = Exit Function End If Loop Else ProcessFtpResponse GetResponseCode(strData) End If ProcessPASSCommand = GetResponseCode(strData) Exit_Label: Exit FunctionProcessPASSCommand_Err_Handler: If Not ProcessWinsockError(Err.Number, Err.Description) Then Err.Raise vbObjectError + 1000 + Err.Number, CFtpConnection.ProcessPASSCommand, Err.Description End If GoTo Exit_Label End Function 下面方法附加到PASS命令中发送到服务器,并处理服务器的响应。Private Function ProcessPWDCommand() As Boolean Dim strResponse As String Dim strData As String On Error GoTo ProcessPWDCommand_Err_Handler wscControl.SendData PWD & vbCrLf Debug.Print PWD m_objTimeOut.StartTimer Do DoEvents If m_objTimeOut.Timeout Then m_LastError = ERROR_FTP_USER_TIMEOUT Exit Do End If If InStr(1, m_strWinsockBuffer, vbCrLf) 0 Then strData = m_strWinsockBuffer m_strWinsockBuffer = Exit Do End If Loop m_objTimeOut.StopTimer If GetResponseCode(strData) = FTP_RESPONSE_PATHNAME_CREATED Then Dim intPosA As Integer, intPosB As Integer intPosA = InStr(1, strData, Chr$(34) + 1 intPosB = InStr(intPosA, strData, Chr$(34) If intPosA 1 And intPosB 0 Then m_strCurrentDirectory = Mid$(strData, intPosA, intPosB - intPosA) ProcessPWDCommand = True Else raise error - unknown response format End If Else ProcessFtpResponse GetResponseCode(strData) End If Exit_Label: Exit FunctionProcessPWDCommand_Err_Handler: If Not ProcessWinsockError(Err.Number, Err.Description) Then Err.Raise vbObjectError + 1000 + Err.Number, CFtpConnection.ProcessPWDCommand, Err.Description End If GoTo Exit_Label End FunctionPrivate Sub Class_Terminate() Call BreakeConnection Set wscData = Nothing Set wscControl = Nothing m_objTimeOut.StopTimer Set m_objTimeOut = Nothing End SubPrivate Sub wscControl_DataArrival(ByVal bytesTotal As Long) Dim strData As String wscControl.GetData strData m_strWinsockBuffer = m_strWinsockBuffer & strData m_strLastServerResponse = strData m_objTimeOut.Reset If GetResponseCode(strData) = 426 Then If m_bTransferInProgress Or m_bUploadFile Then wscData.Close Close m_intLocalFileID m_strDataBuffer = m_lDownloadedBytes = 0 m_lUploadedBytes = 0 m_bTransferInProgress = False m_bUploadFile = False m_bFileIsOpened = False End If wscControl.Close m_bBusy = False End If Debug.Print Left(strData, Len(strData) - 2) End SubPrivate Function ProcessPORTCommand() As Boolean Dim intPort As Integer Dim strIPAddress As String Dim colIPAddresses As New Collection Dim strSend As String Dim strData As String On Error Resume Next RaiseEvent StateChanged(FTP_ESTABLISHING_DATA_CONNECTION) Do intPort = GetFreePort If wscData.State sckClosed Then wscData.Close wscData.LocalPort = intPort wscData.Listen If Not Err Then Exit Do Loop On Error GoTo ProcessPORTCommand_Err_Handler strIPAddress = CStr(wscControl.LocalIP) strSend = PORT & Replace(strIPAddress, ., ,) strSend = strSend & , & intPort 256 & , & (intPort Mod 256) strSend = strSend & vbCrLf wscControl.SendData strSend Debug.Print Left(strSend, Len(strSend) - 2) m_objTimeOut.StartTimer Do DoEvents If m_objTimeOut.Timeout Then m_LastError = ERROR_FTP_USER_TIMEOUT Exit Do End If If InStr(1, m_strWinsockBuffer, vbCrLf) 0 Then strData = m_strWinsockBuffer m_strWinsockBuffer = Exit Do End If Loop m_objTimeOut.StopTimer If GetResponseCode(strData) = FTP_RESPONSE_COMMAND_OK Then ProcessPORTCommand = True RaiseEvent StateChanged(FTP_DATA_CONNECTION_ESTABLISHED) Else ProcessFtpResponse GetResponseCode(strData) End If Exit_Label: Exit FunctionProcessPORTCommand_Err_Handler: If Not ProcessWinsockError(Err.Number, Err.Description) Then Err.Raise vbObjectError + 1000 + Err.Number, CFtpConnection.ProcessPORTCommand, Err.Description End If GoTo Exit_Label End Function在和服务器连接之前,首先要保证服务器的地址不为空,关闭wscControl将连接设为0,连接服务器。启动定时器,如果超时,就退出,否则检查wscControl的状态,并进行相应的处理。Public Function Connect() As BooleanOn Error GoTo Connect_Err_HandlerDim strData As Stringm_strWinsockBuffer = m_bBusy = TrueIf Len(m_varFtpServer) 0 Then With wscControl .Close .LocalPort = 0 .Connect m_varFtpServer, 21 m_objTimeOut.StartTimer Do DoEvents If m_objTimeOut.Timeout Then m_LastError = ERROR_FTP_USER_TIMEOUT Exit Do End If If .State = sckConnected Then m_objTimeOut.StopTimer RaiseEvent StateChanged(FTP_CONNECTION_CONNECTED) m_objTimeOut.StartTimer Do DoEvents If m_objTimeOut.Timeout Then m_LastError = ERROR_FTP_USER_TIMEOUT Exit Do End If If Len(m_strWinsockBuffer) (RESPONSE_CODE_LENGHT - 1) Then strData = m_strWinsockBuffer m_strWinsockBuffer = Exit Do End If Loop m_objTimeOut.StopTimer Select Case GetResponseCode(strData) Case FTP_RESPONSE_SERVICE_READY_FOR_NEW_USER Select Case ProcessUSERCommand Case FTP_RESPONSE_USER_LOGGED_IN Connect = True Case FTP_RESPONSE_USER_NAME_OK_NEED_PASSWORD If ProcessPASSCommand = FTP_RESPONSE_USER_LOGGED_IN Then Connect = True End If End Select Get working directory If Connect Then Call ProcessPWDCommand End If Case FTP_RESPONSE_SERVICE_READY_IN_MINUTES 120 Service ready in nnn minutes. m_LastError = ERROR_FTP_PROTOCOL_SERVICE_READY_IN_MINUTES Case FTP_RESPONSE_SERVICE_NOT_AVAILABLE_CLOSING_CONTROL_CONNECTION 421 Service not available, closing control connection. m_LastError = ERROR_FTP_PROTOCOL_SERVICE_NOT_AVAILABLE_CLOSING_CONTROL_CONNECTION End Select Exit Do ElseIf .State = sckConnectAborted Then m_LastError = ERROR_FTP_WINSOCK_ConnectAborted ElseIf .State = sckResolvingHost Then RaiseEvent StateChanged(FTP_CONNECTION_RESOLVING_HOST) ElseIf .State = sckHostResolved Then RaiseEvent StateChanged(FTP_CONNECTION_HOST_RESOLVED) End If Loop m_objTimeOut.StopTimer End WithElse raise error Connect = False Exit FunctionEnd IfExit_Label: If Connect Then RaiseEvent StateChanged(FTP_USER_LOGGED) m_bBusy = False Exit FunctionConnect_Err_Handler: If Not ProcessWinsockError(Err.Number, Err.Description) Then Err.Raise vbObjectError + 1000 + Err.Number, CFtpConnection.Connect, Err.Description End If GoTo Exit_Label End Function下载文件:文件传输涉及到重新开始命令和获得文件命令。重新开始命令的命令参数域代表服务器要重新开始的那一点,此命令并不传送文件,而是简单指定点后的数据,获得文件命令使服务器DTP传送指定路径内的文件副本到服务器或用户DTP,这边服务器上文件的状态和内容不受影响。ProcessRESTCommand方法向FTP服务器发送REST命令,告诉服务器文件要开始传输的位置,并处理服务器的响应。如果成功返回true,反之返回false。Private Function ProcessRESTCommand(lStartPoint As Long) As Boolean Dim strResponse As String Dim strData As String On Error GoTo ProcessRESTCommand_Err_Handler wscControl.SendData REST & lStartPoint & vbCrLf Debug.Print REST & lStartPoint m_objTimeOut.StartTimer Do DoEvents If m_objTimeOut.Timeout Then m_LastError = ERROR_FTP_USER_TIMEOUT Exit Do End If If InStr(1, m_strWinsockBuffer, vbCrLf) 0 Then strData = m_strWinsockBuffer m_strWinsockBuffer = Exit Do End If Loop m_objTimeOut.StopTimer If GetResponseCode(strData) = FTP_RESPONSE_REQUESTED_FILE_ACTION_PENDING_FURTHER_INFO Then ProcessRESTCommand = True Else ProcessFtpResponse GetResponseCode(strData) End If Exit_Label: Exit FunctionProcessRESTCommand_Err_Handler: If Not ProcessWinsockError(Err.Number, Err.Description) Then Err.Raise vbObjectError + 1000 + Err.Number, CFtpConnection.ProcessRESTCommand, Err.Description End If GoTo Exit_Label End FunctionProcessRETRCommand方法向FTP服务器发送REST命令,让ftp服务器传送指定路径的文件副本到本地,并处理服务器的响应。如果成功返回true,反之返回false。Private Function ProcessRETRCommand(strFileName As String, lStartPoint As Long) As Boolean Dim strResponse As String Dim strData As String On Error GoTo ProcessRETRCommand_Err_Handler m_strDataBuffer = wscControl.SendData RETR & strFileName & vbCrLf Debug.Print RETR & strFileName m_objTimeOut.StartTimer Do DoEvents If m_objTimeOut.Timeout Then m_LastError = ERROR_FTP_USER_TIMEOUT Exit Do End If If Not m_bTransferInProgress Then strData = m_strWinsockBuffer Exit Do End If If InStr(1, m_strWinsockBuffer, vbCrLf) 0 Then If GetResponseCode(m_strWinsockBuffer) = 150 Or _ GetResponseCode(m_strWinsockBuffer) = 125 Then If lStartPoint = 0 And FileExists(m_strLocalFilePath) Then Kill m_strLocalFilePath End If m_intLocalFileID = FreeFile Open m_strLocalFilePath For Binary As m_intLocalFileID If lStartPoint 0 Then Seek m_intLocalFileID, lStartPoint + 1 End If turn on flag m_bFileIsOpened m_bFileIsOpened = True ignore 150 and 125 reply codes m_strWinsockBuffer = Mid$(m_strWinsockBuffer, InStr(1, m_strWinsockBuffer, vbCrLf) + 2) RaiseEvent StateChanged(FTP_TRANSFER_STARTING) Else strData = m_s

温馨提示

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

评论

0/150

提交评论