正在发送文件到远程 FTP 服务器
Sending file to distant FTP server
我有一个任务“将文件发送到远程 FTP 服务器”。我写了代码,但它不能正常工作。我创建了一个用于数据传输的套接字并尝试上传我的文件。上传文件后,我想使用 recv()
检查服务器答案,但此时我的程序挂起,但我可以在服务器上看到我的文件。如果我从我的代码中删除 recv()
,我的文件大小为 0 字节。几天来我一直在努力解决这个问题。谁能帮帮我?
我正在使用此 FTP 服务器进行测试:ftp://speedtest.tele2.net/
int upload_file(char *filename) {
char str[256];
char buff[1024];
int getFile;
int bytes_read;
//ds - for data
sprintf(str, "CWD %s\r\n", "upload");
send(s, str, strlen(str), 0);
get_server_answer();
switch_to_passive_mode();
sprintf(str, "TYPE I\r\n");
send(s, str, strlen(str), 0);
get_server_answer();
sprintf(str, "STOR %s\r\n", filename);
send(s, str, strlen(str), 0);
get_server_answer();
getFile = open(filename, O_RDONLY, 0644);
while (1) {
bytes_read = read(getFile, buff, 1024);
if (bytes_read <= 0)
break;
send(ds, buff, bytes_read, 0);
}
char tmp[256];
recv(s, tmp, 256, MSG_WAITALL); // program hangs here
close(getFile);
close(ds);
close(s);
return 0;
}
默认情况下,FTP 数据传输在 STREAM
传输模式下运行。在那种模式下,通过 ds
套接字发送文件数据后,您需要关闭 ds
套接字以向服务器发出文件结束信号,before 试图读取服务器的答案(你为什么不使用 get_server_answer()
而不是?)。由于您没有这样做,您正在等待永远不会发送的最终服务器答复。
当您删除 recv()
时,您将同时关闭 ds
和 s
套接字。通过关闭 s
套接字而不首先发送 QUIT
命令,服务器认为您的客户端在收到服务器的回答之前意外消失,因此它中止传输。
因此,您需要:
close ds
(但不是 s
!)after 你的循环结束了,但是 before 你读了答案。
使用MODE
命令将数据连接的传输模式切换为BLOCK
或COMPRESSED
模式,不会通过关闭数据连接发出EOF信号.有关详细信息,请参阅 RFC 959 第 3.4 节。
此外,在通过 ds
[=27= 发送文件数据之前,您没有验证对 STOR
命令的初始答复是否成功(答复代码为 125 或 150) ]
我有一个任务“将文件发送到远程 FTP 服务器”。我写了代码,但它不能正常工作。我创建了一个用于数据传输的套接字并尝试上传我的文件。上传文件后,我想使用 recv()
检查服务器答案,但此时我的程序挂起,但我可以在服务器上看到我的文件。如果我从我的代码中删除 recv()
,我的文件大小为 0 字节。几天来我一直在努力解决这个问题。谁能帮帮我?
我正在使用此 FTP 服务器进行测试:ftp://speedtest.tele2.net/
int upload_file(char *filename) {
char str[256];
char buff[1024];
int getFile;
int bytes_read;
//ds - for data
sprintf(str, "CWD %s\r\n", "upload");
send(s, str, strlen(str), 0);
get_server_answer();
switch_to_passive_mode();
sprintf(str, "TYPE I\r\n");
send(s, str, strlen(str), 0);
get_server_answer();
sprintf(str, "STOR %s\r\n", filename);
send(s, str, strlen(str), 0);
get_server_answer();
getFile = open(filename, O_RDONLY, 0644);
while (1) {
bytes_read = read(getFile, buff, 1024);
if (bytes_read <= 0)
break;
send(ds, buff, bytes_read, 0);
}
char tmp[256];
recv(s, tmp, 256, MSG_WAITALL); // program hangs here
close(getFile);
close(ds);
close(s);
return 0;
}
默认情况下,FTP 数据传输在 STREAM
传输模式下运行。在那种模式下,通过 ds
套接字发送文件数据后,您需要关闭 ds
套接字以向服务器发出文件结束信号,before 试图读取服务器的答案(你为什么不使用 get_server_answer()
而不是?)。由于您没有这样做,您正在等待永远不会发送的最终服务器答复。
当您删除 recv()
时,您将同时关闭 ds
和 s
套接字。通过关闭 s
套接字而不首先发送 QUIT
命令,服务器认为您的客户端在收到服务器的回答之前意外消失,因此它中止传输。
因此,您需要:
close
ds
(但不是s
!)after 你的循环结束了,但是 before 你读了答案。使用
MODE
命令将数据连接的传输模式切换为BLOCK
或COMPRESSED
模式,不会通过关闭数据连接发出EOF信号.有关详细信息,请参阅 RFC 959 第 3.4 节。
此外,在通过 ds
[=27= 发送文件数据之前,您没有验证对 STOR
命令的初始答复是否成功(答复代码为 125 或 150) ]