2013-04-09 200 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

相关问题