【问题标题】:C programming Sockets recvC 编程套接字接收
【发布时间】: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,因此您必须多次读取。

标签: c sockets


【解决方案1】:

套接字仅限于数据包,它不知道您正在下载什么。

如果您使用 HTTP 从 Web 服务器下载文件,则可以使用 HTTP 响应标头来获取所需的信息“Content-Length” 见:http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

因此读取第一个数据包并将接收到的数据的第一个字节解释为“HTTP响应头”以了解必须下载多少。

【讨论】:

  • 这是正确的谢谢。现在我需要找到一种方法将标题与“实际数据”分开
  • TCP 套接字不限于单个数据包,它根本不限于数据包,因为 TCP 是基于流的协议。因此,您从 recv 获得的内容可能已以多个数据包的形式发送,或者您可能仅获得半个数据包的内容(如果您指定小尺寸)。
  • 你是对的,我会改变的。但是 HTTP 内容长度仍然是最好的估计值还是我错了?。
  • 如果 content-lenght 出现在标题中,它就是您正在下载的数据的确切大小。但是,服务器可能不会发送它,然后你就不会事先知道有多少数据来了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多