我需要使用 HTTP 协议(protocol)发送文件,但问题是我是否应该使用套接字,因为我有大文件?或者我可以使用 WinHttpApi,例如:
BOOL HttpSendRequest(
__in HINTERNET hRequest,
__in LPCTSTR lpszHeaders,
__in DWORD dwHeadersLength,
__in LPVOID lpOptional,
__in DWORD dwOptionalLength
);
并为我想要的文件使用 lpOptional?我应该划分文件还是该 API 处理大文件?
如果我使用 HTTP api,文件大小是否有任何限制,我应该分配数据吗?
最佳答案
HTTP uses TCP sockets对于它的连接:
HTTP communication usually takes place over TCP/IP connections. The default port is TCP 80 [19], but other ports can be used. This does not preclude HTTP from being implemented on top of any other protocol on the Internet, or on other networks. [...]
(原则上它可以使用其他东西,但这很不寻常。)
与通过套接字设计自己的协议(protocol)相比,使用 HTTP 的优势在于有大量现有的 HTTP 库(以及其他参数)。无论如何,您都必须定义自己的小协议(protocol),即使只是为了告诉远程方文件何时开始和停止。
HTTP 有几点帮助:
- 它可以在你读完一个文件时告诉你,使用
Content-Length
header或 chunked transfer encoding .这是必要的,因为你 can't generally distinguish clean and abrupt connection closures in TCP (具有isConnected
之类功能的 API 是不够的)。 - 如果连接在一个大文件上突然失败,您可以使用 Range header指定要获取文件的哪一部分。 (你可以用它做并行流。)
如果您确实选择使用 HTTP,请尝试阅读更多有关它的内容。您实际上可能会发现 Web 服务器和 Web 客户端已经实现了您所需要的功能。我不确定 lpOptional
是关于什么的,但是您应该在构建的 URL 中指定要获取的文件。 (在您的服务器上构建您自己的 URL 空间。)
关于c - 使用 winHttpApi 或套接字发送大文件是否明智?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8864877/