【发布时间】:2014-04-15 21:51:11
【问题描述】:
我已经使用套接字发出了成功的调用 Web 请求并打印了结果。这是通过 send 和 recv 方法完成的。现在我希望能够给出接收到多少字节以及需要下载多少字节的粗略指示。但我根本不知道如何在 C 中实现这一点。
我目前收到的代码是:(我没有在电脑上使用实际代码)
while ((rev = recv(sockfd, buf, size-1, 0)) > 0) {
//Print result etc
}
【问题讨论】:
-
您知道已接收到多少字节,因为作为从套接字读取的一部分,返回值是缓冲区中接收到的字节数。因此,您只需要一个从零开始然后按接收到的字节数递增的计数器。您知道要下载多少字节的唯一方法是让套接字的另一端告诉您。套接字只是将字节从一个地方移动到另一个地方的传输设备。它对正在传输的内容的语义一无所知。您使用的是 HTTP 协议吗?
-
是的,我使用的是 HTTP 协议。但 rev 不是完整的数量,或者这不可能吗?
-
您将需要与连接的远程端达成某种协议,以提供某种数据长度值。 HTTP 协议指定一个标头,后跟数据。但是,标头中的内容将根据远程应用程序和发送的 HTTP 请求(GET、POST 等)的类型而有所不同。 GET 旨在将请求信息放入标头第一行中指定的 URI。来自符合标准的远程应用程序的 POST 将在请求标头中提供额外的指令,包括 Content-Length: 指令。
-
还有一点是TCP/IP是字节流传输,所以你需要知道对方发送的字节流是什么。我相信 HTTP 标头是 UTF-8,但是在标头结束后(我相信用空行表示)其余数据可能是也可能不是 UTF-8 字符。如果数据流中有多个文件,标题中也会指定一个分隔符字符串。每个
recv()调用只返回当前接收到的字节,TCP 可能会引入延迟,因此一个 2K 字节的文件分 3 批接收,分别为 .5K、1K 和 .5K,因此您必须多次读取。