2012-11-20 53 views
0

我必須在C語言中爲Linux編寫一個小命令行FTP客戶端。它適用於常見用途(目錄管理,檢索和存儲文件等),我想添加主動模式(此時每次傳輸都是在被動模式下進行的)。
我知道我必須在形狀發出命令:如何在C中啓動FTP客戶端的主動模式,linux

PORT a,b,c,d,e,f 

其中a b c d是IP地址塊和e f的端口號。然而,據我所知,IP必須是我的客戶端運行的機器的IP,但我建議使用getsockname()。從我測試過的,getsockname()得到我的插座使用的接口的本地IP,而不是從互聯網上看到的我的IP。所以我不能給這個IP地址的服務器連接。

現在的問題是:我是否正確理解了命令PORT,以及如何獲取正確的ip發送它?

回答

1

FTP活動模式意味着服務器打開與客戶端的連接併發送數據。這通常是不實際的,所以發明了被動模式:服務器打開一個額外的端口,用於監聽傳入的連接並在有人連接時開始傳輸。

因此,被動模式會是這樣的:

$ telnet localhost 21 
220 Welcome to EarlGray FTP 
USER ftp 
331 Please specify the password. 
PASS ftp 
230 Login successful. 
PASV 
227 Entering Passive Mode (127,0,0,1,185,37). 
LIST 
150 Here comes the directory listing. 
      ---> here client opens another telnet session, 
      ---> connecting to the same server on port 185*256+37, specified by server: 
       $ telnet localhost $((185 * 256 + 37)) 
       Trying 127.0.0.1... 
       Connected to localhost. 
       Escape character is '^]'. 
       drwxrwxr-x 2 121  1003   4096 Aug 21 10:57 incoming 
       drwxrwxr-x 7 0  1003   4096 Nov 09 21:04 pub 
       Connection closed by foreign host. 
      <---- end of data transfer session 

226 Directory send OK. 

而活動的會話的例子:

$ telnet localhost 21 
Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'. 
220 Welcome to EarlGray FTP 
USER ftp 
331 Please specify the password. 
PASS ftp 
230 Login successful. 
PORT 127,0,0,1,45,45      (ports are specified by client) 
200 PORT command successful. Consider using PASV. 
LIST 
150 Here comes the directory listing. 

     ---> here client listens for an incoming connection on port 45*256+45 
      $ nc -l 0.0.0.0 $((45 * 256 + 45)) 
      drwxrwxr-x 2 121  1003   4096 Aug 21 10:57 incoming 
      drwxrwxr-x 7 0  1003   4096 Nov 09 21:04 pub 
     <--- data are rececived 

226 Directory send OK. 

附: FTP是一種非常古老的協議(定義從1970年左右開始),定義了當沒有路由器,門和其他傳輸級別的好東西時,通常有幾臺機器直接相連,所以主動模式工作得很好,被動模式是協議今天仍然存在。

所以,是的,你已經得到PORT命令權,但沒有統一的方式讓您的外部IP(可能有幾個你在本地機器上的幾個不同的網絡IP地址,可能有幾個門與自己的網絡在去服務器的路上,你想用哪一個?)。問題的第二部分,如何讓服務器看到你的IP,無法應答(這就是被動模式的原因)。

+0

謝謝,我得到了正確的(併爲被動模式工作),但我更需要從程序的角度來看,如何知道我的IP指定到服務器?它可能是或可能不在同一個本地網絡中(無論如何,我從它的主機名而不是它的IP訪問它),並且我不知道NAT;這是我大學的服務器(我正在從uni內外進行測試)。 –

+0

@tehinternetsismadeofcatz如果你的主機不能直接從服務器訪問,你就不能使用主動模式。這就是被動模式存在的原因。 NAT從內部跟蹤連接以確定如何路由答案,但它們不提供建立到後面點的連接的方式。 –

+0

嗯,這是一個提升我的客戶的指南:當基本完成時(這是我的情況),嘗試實現主動模式。所以我想它應該可以直接工作,如果我可以得到我的IP地址:D –

0

如果你在NAT後面,NAT的責任就是打破PORT/226命令/響應中地址的端到端原則。該NAT應該明確支持FTP。