魔戒3加长版:利用Winsock控件实现FTP编程

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 07:49:31

引言

       随着计算机在铁路各部门的普及,办公无纸化逐渐成为一种趋势,文件、资料、报表等数据的传送都通过计算机网络来完成。FTP成为传送这些数据的流行工具。为了更好地使用FTP,应该了解和掌握FTP编程。只有把FTP内嵌到应用程序中去,FTP的应用才更灵活,才能满足各种数据传输的需要。本文以VB中的Winsock控件为工具,根据FTP的基本原理,阐明了FTP客户端编程的一般方法。

 

二 FTP客户端与服务器间的基本协作过程

              下面是FTP模型的基本原理图:

 

 

服务器数据传输进程

客户端数据传输进程

文件系统

服务器协议接口

客户端协议接口

用户界面

用户

FTP命令

FTP响应

数据连接

文件系统

 

 

 

 

 

 

 

 

 

 

 

 


      

 

 

                   服务器FTP                                    客户端FTP

 

 

1、客户端与服务器连接

                FTP是建立在TCP之上的连接,端口号使用21。若客户端与服务器之间成功连接,服务器将返回字符串,如:

220 GMS Version 5.0

      前三个字符220表示客户端与服务器成功连接,后面的字符会因服务器的不同而不同,但我们只关心前三个字符。

    2、用户名和密码认证

            客户端发送用户名给服务器,如:

                                     USER guo

         如果服务器找到用户名guo,将返回字符串,如:

                            331 User name okay, need password.

        接着客户端应发送密码给服务器,如:

                                                                           PASS aaa

         密码正确,返回如:

                               230 User logged in, proceed.

         如果用户名或密码认证没通过,返回如:

530 Not logged in.

         用户名也可以使用匿名,如:

                                  USER anonymous

         返回如:

                   331 Anonymous access allowed,send identity (e-mail name) as password.

3、建立数据连接

      FTP协议用两个连接来达到客户机与服务器之间交换数据的目的。刚才建立了第一个连接——控制连接,它用于传送命令和响应。我们还要建立第二个连接——数据连接,用于数据传输。FTP提供了两种方式来建立数据连接,一种用PORT命令,一种用PASV命令。我们使用后者。客户端发送PASV命令给服务器,服务器返回IP地址和端口号,用来提供给客户端进行数据连接。如:

227 Entering Passive Mode (10,175,125,49,9,17)

          括号里6个数字中前4个数字表示IP地址10.175.125.49,后2个数字表示端口号,这2个数字按如下公式计算端口号:

                               9*256+17=2321

          这样,客户端就可用IP地址10.175.125.49和端口号2321连接服务器,建立数据连接。

     4、其它相关的命令及响应

        LIST命令

    该命令用于获取FTP服务器的目录列表,服务器操作成功后返回:

150 Opening ASCII mode data connection for /bin/ls.

目录列表要通过数据连接进行传输,若数据连接没有准备好,则返回:

             425 Can’t open data connection.

目录列表传到客户端后,返回:

              226 Transfer complete.

        CWD命令

该命令用于改变服务器的工作目录。如:

CWD BOOKS

服务器操作成功返回:

       250 Directory changed to /c:/BOOKS.

若没有找到该目录,返回:

550 /c:/BOOK: No such file or directory.

        RETR命令

            该命令用于文件下载。如

                            RETR a.txt

    服务器返回:

                   150 Opening ASCII mode data connection for a.txt (124 bytes).

226 Transfer complete.

        STOR命令

该命令用于上传文件。如:

       STOR b.txt

服务器返回:

     150 Opening ASCII mode data connection for b.txt.

      以上阐明了客户端与服务器间的基本协作过程,完整的FTP协议请参阅RFC 959文档。

 

程序实例

   根据上述FTP的基本原理,利用VBWinsock控件提供的TCP连接功能,下面举一简单的实例。该例子只实现从服务器(IP地址为10.175.125.49C\b目录下载文本文件a.txt到客户端C\a目录,从客户端C\a目录上传文本文件b.txt到服务器C\b目录。设服务器用户名为aaa,密码为aaa

    建立VB工程,添加两个Winsock控件:Winsock1Winsock2Winsock1用于命令连接,Winsock2用于数据连接。添加两个命令按扭:downloaduploaddownload 用于下载,upload用于上传。

   程序代码具体如下:

 

Dim downorup As String

 

Private Sub Form_Load()

Winsock1.Connect "10.175.125.49", 21   ‘建立命令连接

End Sub

 

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim strData As String

Winsock1.GetData strData

If Left(strData, 3) = "220" Then    ‘若命令连接成功

                Login   ’登录

End If

If Left(strData, 3) = "227" Then    ‘若成功进入PASV方式

               MakeDataConnection strData      ‘建立数据连接

End If

End Sub

 

Private Sub Login()

Winsock1.SendData "USER aaa" & vbCrLf     ‘发送用户名

Winsock1.SendData "PASS aaa" & vbCrLf      ‘发送密码

End Sub

 

Private Sub Setpasv()

Winsock1.SendData "PASV" & vbCrLf            ‘设置PASV方式

End Sub

 

Private Sub download_Click()

ChDir "c:\a"      ‘改变客户端工作目录

Winsock1.SendData "CWD b" & vbCrLf      ‘改变服务器工作目录

Setpasv

Winsock1.SendData "RETR a.txt" & vbCrLf       ‘下载

End Sub

 

Private Sub upload_Click()

    downorup = "up"

    Setpasv

End Sub

 

Private Sub Winsock2_Connect()

If downorup = "up" Then         ‘上传文件,数据连接建立后发送数据

                Dim a As String

               Dim MyString As String

               ChDir "c:\a"

               Open "b.txt" For Binary As #1

Do While Not EOF(1)

                Line Input #1, a

                    MyString = MyString + a + Chr(13) + Chr(10)

               Loop

               Close #1

               Winsock2.SendData MyString & vbCrLf

End If

End Sub

 

Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long)

Dim strData As String       ‘服务器从数据连接传来下载文件的数据时,保存到本地文件系统中

Winsock2.GetData strData

ChDir "c:\a"

Open "a.txt" For Output As #1

Print #1, strData

Close #1

End Sub

 

Private Sub MakeDataConnection(sData As String)

    Dim iPos As Integer, iPos2 As Integer

    Dim strDataAddress

    iPos = InStr(1, sData, "(") + 1       ‘获取IP地址

    For i = 1 To 4

        iPos2 = InStr(iPos, sData, ",")

        strDataAddress = strDataAddress & Mid(sData, iPos, iPos2 - iPos) & "."

        iPos = iPos2 + 1

    Next

    strDataAddress = Left(strDataAddress, Len(strDataAddress) - 1)

    Dim i1 As Single, i2 As Single, inPort As Single     ‘计算端口号

    iPos = iPos2 + 1

    iPos2 = InStr(iPos, sData, ",")

    i1 = CSng(Mid(sData, iPos, iPos2 - iPos))

    iPos = iPos2 + 1

    iPos2 = InStr(iPos, sData, ")")

    i2 = CSng(Mid(sData, iPos, iPos2 - iPos))

    inPort = i1 * 256 + i2

If Not Winsock2.State = sckConnected Then

               Winsock2.Close

End If

               Winsock2.Connect strDataAddress, inPort

End Sub

 

Private Sub Winsock2_SendComplete()

ChDir "c:\a"       ‘上传文件数据通过数据连接发送完后,通知服务器接收并保存到其文件系统中

Winsock1.SendData "CWD b" & vbCrLf

Winsock1.SendData "TYPE ASCII" & vbCrLf

Winsock1.SendData "STRU record-structure" & vbCrLf

Winsock1.SendData "STOR b.txt" & vbCrLf

End Sub

 

         该程序在Windown 98下通过Micosoft Visual Basic 5.0编译执行成功,服务器是运行在Windown 98下的Seuver-U FTP软件。对其他不同文件系统间的FTP,应根据RFC 959文档对程序进行适当的修改,这里不再叙述。

 

结束语

   在铁路各信息系统中,数据的传输是其中重要的一部分。有些系统在总体设计和编程时没有充分考虑数据传输部分,通过安装FTP软件用手工方式进行数据传输,不但降低了效率,还会出现数据漏传,丢失等现象。在总体设计充分考虑数据传输部分,并在编程时将FTP内嵌到应用程序中,这样可以提高传输效率和质量。