我正在创建一个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);
答案 0 :(得分:1)
我猜你将LF发送给客户端,而客户端(正确地)期望CRLF并且警告那些丢失CR的人。
根据FTP规范RFC 959, section 3.4. Transmission modes,在ASCII模式下,您只需要使用CRLF:
出于标准化转移的目的,发送主机将 翻译其内部行尾或记录表示结束 进入传输模式和文件规定的表示 结构,接收主机将执行反向 翻译为其内部表示。 ... ASCII文件中的行尾没有 记录结构应由
表示<CRLF>
答案 1 :(得分:-1)
此问题是因为您正在下载ASCII格式的文件。
登录FTP站点后。键入“ binay”,然后开始下载。
ftp>二进制 200类型设置为I