2013-04-09 202 views
0

我必須編寫一個FTP服務器,並且在傳輸數據時遇到問題。如何通過套接字發送/接收二進制數據?

我在Linux上使用FTP命令來測試它,我目前正在LIST,這將在工作目錄中的文件/目錄列表。一切正常,只是FTP(FTP以及打印文件的列表)打印以下警告:

WARNING! 5 bare linefeeds received in ASCII mode 
File may not have transferred correctly. 

我想刪除的警告,我認爲FTP期待的二進制數據,但我不知道如何通過套接字發送數據那樣的,我目前做的最基本的方式發送ls結果:

dup2(dst_channel, 1); 
execlp("ls", "ls", "-l", NULL); 
+0

FTP預計換行符是CR-LF,但您只是發送LF。 – Barmar 2013-04-09 21:23:10

+0

有沒有辦法改變,而不必讀取命令'ls'的結果並用CR-LF替換每個LF? – 2013-04-09 21:25:21

回答

1

的FTP協議指定LIST命令應派其結果NETASCII,這意味着換行符是r代表CRLF。但是標準的Linux程序僅僅爲換行輸出LF。

您需要運行ls命令,並將其輸出連接到管道。您的服務器從管道讀取數據,用\ r \ n替換任何\n字符,並將其寫入套接字。

在傳輸實際文件時,除了客戶端請求二進制模式時,您需要做類似的事情。

+0

謝謝,這不是很實際,但我會做到這一點...... – 2013-04-09 21:53:53

+2

另一種方法是實現自己的'ls'代碼,以FTP的格式輸出。如果你想在RFC 3659中實現'MLSD'命令,你需要這樣做。 – Barmar 2013-04-09 21:57:58

相關問題