微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将文件发送到远程 FTP 服务器

如何解决将文件发送到远程 FTP 服务器

我有一个任务“将文件发送到远程 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,0);
    get_server_answer();
    sprintf(str,"STOR %s\r\n",filename);
    send(s,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,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 套接字以向服务器发送文件结束信号,之前尝试阅读服务器的答案(为什么不使用 get_server_answer() 代替?)。由于您没有这样做,因此您正在等待永远不会发送的最终服务器答案。

当您移除 recv() 时,您将同时关闭 dss 套接字。通过关闭 s 套接字而不先发送 QUIT 命令,服务器认为您的客户端在收到服务器响应之前意外消失,因此它中止传输。

因此,您需要:

  • 关闭ds(但不是s!)之后您的循环结束,但之前您阅读了答案。

  • 使用 MODE 命令将数据连接的传输模式切换为 BLOCKCOMPRESSED 模式,这不会通过关闭数据连接来发出 EOF 信号。有关详细信息,请参阅 RFC 959 第 3.4 节。

此外,在通过 STOR

发送文件数据之前,您没有验证对 ds 命令的初始回答是否成功(回复代码为 125 或 150)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。