我正在创建一个FTP服务器作为一个学校项目,大部分的命令是工作的,我几乎钉住了PORT (主动模式的数据传输)。
使用这样的ftp启动服务器:
ftp localhost 4242 // where 4242 is the port on which my server is listening并且在登录后使用命令ls,我收到一个工作的ls输出,后面跟着下面的消息:
警告!在ASCII模式文件中接收到的8个裸行提要可能没有正确传输。
请注意,当在ls中使用ftp时,在使用LIST命令之前,它会自动切换到活动模式。
这个错误意味着什么?
全部产出:
200 Active Mode Enabled.
150 Directory listing.
total 56
drwxrwxr-x 4 kade_c kade_c 4096 mai 12 15:24 .
drwxr-xr-x 38 kade_c kade_c 4096 mai 12 14:58 ..
drwxrwxr-x 8 kade_c kade_c 4096 mai 12 15:17 .git
-rw-rw-r-- 1 kade_c kade_c 1726 mai 11 10:35 Makefile
-rw-rw-r-- 1 kade_c kade_c 161 mai 11 11:43 README.txt
-rwxrwxr-x 1 kade_c kade_c 29368 mai 12 15:24 server
drwxrwxr-x 4 kade_c kade_c 4096 mai 2 18:40 server_src
WARNING! 8 bare linefeeds received in ASCII mode
File may not have transferred correctly.
226 LIST complete.最后,下面是创建并连接到套接字并执行ls -la的代码的一部分
server_write(client, "150 Directory listing.\r\n");
if (connect_data(client) == -1) // Creates socket and connects to it
{
server_write(client, "520 Impossible to reach client.\r\n");
return;
}
ofd = xdup(1);
xdup2(client->data.socket, 1);
system("ls -la");
xdup2(ofd, 1);
server_write(client, "226 LIST complete.\r\n");
close_data(client, -1);发布于 2016-05-12 13:27:25
我猜你会发送LF给客户,客户(正确地)期望CRLF的,并警告那些丢失的CR。
根据FTP规范,RFC 959,第3.4节。传输方式,在ASCII模式下,您需要独占地使用CRLF:
为了实现标准化传输,发送主机将其内部行尾或记录端表示转换为传输模式和文件结构所规定的表示,接收主机将对其内部表示进行逆转换。.
<CRLF>应该指示没有记录结构的ASCII文件中的行尾。
发布于 2018-09-05 08:14:40
此问题是因为您正在以ASCII模式下载文件。切换到二进制模式将使警告消失。
登录到FTP服务器后,键入binary,然后开始下载。
ftp> binary
200 Type set to I.您只需在每次FTP会话中运行此命令一次。
https://stackoverflow.com/questions/37187986
复制相似问题