【问题标题】:File Download - WinSock文件下载 - WinSock
【发布时间】:2015-08-18 08:48:40
【问题描述】:

通过 C 语言中的 WinSock 从我的服务器下载 exe 文件后,我收到此错误:

这是我用来将读取的字节写入文件的代码:

while (recv(mySock, buf, FILEBUFFER, 0) > 0)
{
     WriteFile(hFile, buf, sizeof(buf), &bytes, NULL);
}

这里是使用的变量定义:

#define FILEBUFFER 2048

CHAR buf[2048]

有谁知道我该如何解决这个问题,或者问题是什么?

【问题讨论】:

    标签: c winapi winsock


    【解决方案1】:

    首先,如果你使用普通的winsock来下载文件,你需要构造正确的http请求并正确处理响应。当您从服务器获得响应时,请确保您处理响应而不是盲目地将其写入文件。

    其次,您应该检查recv 的返回值,以查看它接收了多少字节并改为写入该数量。

    第三,如果你只是想下载一个文件而不手动处理请求和响应,你可以使用URLDownloadToFile API或者使用WinInet API。

    【讨论】:

      【解决方案2】:

      您假设recv 每次都返回完整的缓冲区,但不能保证(在简单地测试> 0 时)它返回的字节数超过1 个。您需要使用recv 的结果作为写入文件的数据量。

      【讨论】:

      • 哦,所以在 WriteFile 中,我不是 buf,而是:while (var1 = recv(mySock, buf, FILEBUFFER, 0) > 0){ WriteFile(hFile, var1, sizeof(var1), &bytes, NULL); } ?
      • @AndrewPeters: sizeof(var1) ?严重地? buf 仍然是要写入的缓冲区,var1 是其中有多少数据。
      • 大声抱歉,这是一个快速的 30 秒响应,没有考虑你首先说的内容。所以var1 将取代我的sizeof(),如果这就是你的意思?因为 recv() 返回它为当前实例读取的字节的“数量”或大小?
      • @AndrewPeters:是的。当然,也不要盲目地从连接中读取,直到它失败为止。如果您事先不知道文件的大小,则无法进行充分的错误检查以确保您确实收到了整个文件。所以先发送/接收文件大小,然后接收实际文件,并将读取的大小与实际大小进行比较。如果它们不匹配,请不要使用该文件。
      • 非常感谢 remy 的建议,如果可以的话,我会给你一个 +1。但是我如何从响应中只检索内容长度段?
      猜你喜欢
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      相关资源
      最近更新 更多