是否可以通过FTP上传文件并重用相同的DATA端口?

时间:2014-03-29 19:03:51

标签: ftp winsock

我们正在使用一个FTP Active客户端类,但我们正在尝试重用相同的数据套接字 传输多个文件。为了理解这种行为,我只使用了ftp.exe(Active)客户端 来自微软,然后我上传了2个文件,如下所示。

使用(活动)FTP客户端时,客户端会发出命令PORT,例如192,168,150,80,14,178(端口3762)。然后,端口20上的服务器连接回本地端口3762上的客户端,并上传文件。

问题是当我发送第二个文件时,客户端发出另一个PORT命令,并使用另一个本地端口,例如3763。这是Microsoft FTP客户端的行为。

然而,在我们的FTP类中,我们有更多的控制权,因为我们正在对所有端口进行所有绑定。 我确实设法使用相同的客户端本地端口传输第二个2文件,但在某些时候服务器向客户端发送信息以关闭该端口,然后第二个文件传输失败。

有没有办法绕过这种行为?我们现在不能使用PASSIVE ftp。

由于

C:\>ftp
ftp> open 10.10.10.10
Connected to 10.10.10.10.
220 Microsoft FTP Service
User (10.10.10.10:(none)): USER01
331 Password required for USER01.
Password:
230 User logged in.
ftp> cd test
250 CWD command successful.
ftp> put c:\temp\test1.docx
c:\temp\test1.docx: File not found
ftp> put c:\temp\test1.docx
200 PORT command successful.
125 Data connection already open; Transfer starting.
226 Transfer complete.
ftp: 13097 bytes sent in 0.42Seconds 31.11Kbytes/sec.
ftp> put c:\temp\test2.docx
200 PORT command successful.
125 Data connection already open; Transfer starting.
226 Transfer complete.
ftp: 13095 bytes sent in 0.61Seconds 21.54Kbytes/sec.
ftp> quit
221 Goodbye.

基本上在C#中我们这样做:

System.Net.IPEndPoint localEP = new IPEndPoint(IPAddress.Parse(sIPAddr),4900); listening_sock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); listening_sock.Bind(localEP); ... listening_sock.Listen(1); ... //发送PORT命令 //发送STOR命令 listening_sock.Accept(); ... //传输文件(通过流); ... //然后尝试发出另一个STOR命令来传输文件 //如果端口仍处于打开状态,它将传输一些数据,但最终端口会自行关闭。

1 个答案:

答案 0 :(得分:0)

在活动模式下,数据连接的服务器端在端口20上。如果客户端在其侧重用相同的IP和端口,则您具有相同的连接元组(例如,client_ip,client_port,server_ip,server_port)用于连续连接。但是,使用TCP,您必须等待一段时间才能重用相同的元组。这意味着,在活动模式下,客户端需要为每次新​​数据传输宣布一个新端口。

另请参阅RFC959(FTP)第3.3节和第34节;数据连接管理"。