c++ - FTP服务器文件传输

标签 c++ transfer ftp-server

我不确定有关 ftp 文件传输的一些事情。我正在编写一个 ftp 服务器,我正在尝试弄清楚如何使文件传输正常工作。到目前为止,它以某种方式起作用,但我有某些疑问。这是我的文件传输函数(到目前为止只检索):

void RETRCommand(int & clie_sock, int & c_data_sock, char buffer[]){
ifstream file;  //clie_sock is used for commands and c_data_sock for data transfer
char *file_name, packet[PACKET_SIZE]; //packet size is 2040
int packet_len, pre_pos = 0, file_end;
file_name = new char[strlen(buffer + 5)];
strcpy(file_name, buffer + 5);

sprintf(buffer, "150 Opening BINARY mode data connection for file transfer\r\n");

if (send(clie_sock, buffer, strlen(buffer), 0) == -1) {
    perror("Error while writing ");
    close(clie_sock);
    exit(1);
}

cout << "sent: " << buffer << endl;

file_name[strlen(file_name) - 2] = '\0';
file.open(file_name, ios::in | ios::binary);

if (file.is_open()) {

    file.seekg(0, file.end);
    file_end = (int) file.tellg();
    file.seekg(0, file.beg);

    while(file.good()){

        pre_pos = file.tellg();
        file.read(packet, PACKET_SIZE);

        if ((int) file.tellg() == -1)
            packet_len = file_end - pre_pos;
        else
            packet_len = PACKET_SIZE;

        if (send(c_data_sock, packet, packet_len, 0) == -1) {
            perror("Error while writing ");
            close(clie_sock);
            exit(1);
        }

        cout << "sent some data" << endl;

    }

}
else {
    sprintf(buffer, "550 Requested action not taken. File unavailable\r\n", packet);

    if (send(clie_sock, buffer, packet_len + 2, 0) == -1) {
        perror("Error while writing ");
        close(clie_sock);
        exit(1);
    }

    cout << "sent: " << buffer << endl;

    delete(file_name);
    return;
}

sprintf(buffer, "226 Transfer complete\r\n");

if (send(clie_sock, buffer, strlen(buffer), 0) == -1) {
    perror("Error while writing ");
    close(clie_sock);
    exit(1);
}

cout << "sent: " << buffer << endl;

close(c_data_sock);

delete(file_name);
}

所以一个问题是数据传输本身。我不确定它应该如何工作。现在它是这样工作的:服务器将所有数据发送到 c_data_sock,关闭这个套接字,然后客户端开始做一些事情。客户端不应该在服务器发送数据时接收数据吗?另一个问题是 abor 命令。我应该如何接收 abor 命令?我尝试将标志设置为 MSG_OOB 的 recv,但随后我收到一条错误消息,提示“参数无效”。如果有人能给我提示或示例说明如何正确执行此操作,我会很高兴,因为我自己似乎无法弄清楚。

谢谢,

约翰

最佳答案

Ftp 使用两个连接。首先 - 是命令连接,在您的情况下是 clie_sock。应该通过它接收“ABOR”命令。您将以与接收“RETR”命令相同的方式接收它。 接收文件客户端与您的服务器建立数据连接(c_data_sock 套接字)。在客户端连接之前它不会打开,所以这是你第二个问题的答案。服务器执行此功能后,您将无法启动客户端。第一个客户端向您的命令套接字发送“retr”命令。然后你的服务器等待来自客户端的新连接(在向他发送数据 ip 和端口之后)。然后客户端连接(现在您已经准备好 c_data_sock)并将所有数据发送到该套接字,这些数据又由客户端接收。

如果您觉得自己不理解网络,您可能需要阅读更多关于网络的一般知识。我更喜欢这个:http://beej.us/guide/bgnet/

在你用

分配一个数组后,这里也有内存泄漏
file_name = new char[strlen(buffer + 5)];

你需要用

删除它
delete [] file_name;

否则 file_name 将被视为一个简单的指针,而不是一个数组,因此大部分数组内存将由您的应用程序保留,这很糟糕,尤其是在创建服务器时。

关于c++ - FTP服务器文件传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16479898/

相关文章:

c++ - 使用 boost::filesystem 时出错

c++ - 如何在 C++ 中正确设置 double

magento - 从 Magento 多商店安装迁移一个商店

Android 开发 USB 传输

email - 内容传输编码 7 位或 8 位

java - 执行 ftp 时出现错误 "javax.net.ssl.SSLException: 530 Please login with USER and PASS"

c++ - 将多个文件添加到输出以用于额外的编译器 Qt

c++ - 默认构造的 std::string c_str() 值

android - 在不删除旧数据的情况下向 FTP 服务器中的文件添加内容?

iphone - 如何压缩多个图像并从 iPhone 应用程序上传到 FTP 服务器?