从ftp服务器

时间:2018-03-29 19:47:51

标签: c++ sockets ftp

以下是我所拥有的:

    send(serverSocket, "RETR user.png\r\n", 15, 0);

    int iResult;
    int size = 0;

    do {

        iResult = recv(dataSocket, buffer, 30000, 0);
        if (iResult > 0) {
            printf("Bytes received: %d\n", iResult);
            size = size + iResult;
        }
        else if (iResult == 0)
            printf("Connection closed\n");
        else
            printf("recv failed: %d\n", WSAGetLastError());

    } while (iResult > 0);

    cout << "the full size: " << size << endl;

    ofstream fout("test.png", ios_base::binary);
    fout.write(buffer, size);
    fout.close();

在这里,我将文件下载到缓冲区,然后创建一个具有相同类型的文件并将此缓冲区写入其中。问题是我无法打开此文件,因为它已损坏。

我尝试使用十六进制编辑器打开此文件,它与好的编辑器不同,但不是那么多。只有一些额外的字节,整个数据由于它们而稍微移位。 他们来自哪里以及如何摆脱他们?我的计划有什么问题?

hexidemical representation (test.png是我下载的那个,user.png是好的,我用浏览器下载了它)。我标记了2个额外的值,但还有更多值。我希望能够弄清楚这笔交易是什么。提前谢谢。

1 个答案:

答案 0 :(得分:3)

这是你的问题:

iResult = recv(dataSocket, buffer, 30000, 0);

每个循环都会覆盖“缓冲区”的开头。您希望附加到已写入数据的末尾,而不是覆盖它。

这就是你想要的:

iResult = recv(dataSocket, buffer+size, 30000-size, 0);

我假设缓冲区是一个字符数组(或无符号字符,或任何sizeof(1))。如果没有,那么:

char* ptr = (char*)buffer;
iResult = recv(dataSocket, ptr+size, 30000-size, 0);

另一个错误是因为您与服务器处于ASCII模式。所有这些0A字节都被解释为Unix换行符,并且很高兴在每个字符串之前插入Windows回车符0D,字符。我不确定这是因为服务器是以这种方式发送,还是您的I / O调用保存不是二进制模式。但每当我进行FTP传输时,我总是确保在命令提示符下键入“binary”,以便不应用ASCII帮助。

查看FTP命令列表,您可能需要发送“TYPE”命令强制二进制模式。如果不是这样的话,那很有可能就是......