【发布时间】:2018-03-29 19:47:50
【问题描述】:
这是我所拥有的:
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 个额外的值,但还有更多。我希望弄清楚交易是什么有用的。提前致谢。
【问题讨论】:
-
您是否发送了使用二进制模式的说明?
-
为什么人们坚持只发送 sn-ps 代码而不是完整的、可验证的示例(完整,显示失败的案例),而不是如此不精确?
-
您需要阅读更多的 FTP 协议,因为它可能会即时将所有新行转换为 CRLF 对。这发生在所有 POSIX 系统中(可能在 Windows 的 FTP 服务器的某些实现上,纯二进制文件以 TEXT 模式传输),您需要在传输之前设置 BINARY 模式。