【问题标题】:Reading HTTP headers from socket C从套接字 C 读取 HTTP 标头
【发布时间】:2021-07-16 14:14:23
【问题描述】:

我的问题主要是教育性的,所以请不要告诉我你不应该那样做,或者你应该那样做。谢谢。

这基本上是关于 TCP 的工作原理。

我正在用 C 语言实现一个 HTTP 客户端,它基本上只是发送一个 HTTP GET 并从服务器读取响应。现在我想将标题与正文分开。问题是,是否可以从套接字逐字节读取:


while(recv(sockfd, buffer, 1, 0))
{
  // do whatever with buffer[0]
}

或者是这样的:一旦服务器写入套接字,比如 1000 个字节,所以一旦客户端读取甚至 1 个字节,那么所有这些消息都“浪费”并且无法再读取?

因为我记得在过去某个时候处理套接字时,我是这样理解它正在工作的。

【问题讨论】:

  • 你可以为 TCP 做到这一点。数据的边界被保留,不适合接收者缓冲区的数据将被丢弃在 UDP 中。
  • 你可以这样做。而且您可以在几分钟内对其进行测试。

标签: c http tcp


【解决方案1】:

是的,在 TCP 中这是可能的。 TCP 没有消息,只有字节,就像文件一样。你可以发送 1000 个字节,然后接收 1 个字节 1000 次。

事实上,这是一种方便的开始方式,因为如果您尝试接收超过 1 个字节,您可能无法获得您所要求的相同数量的字节,您可以得到任何数量到 1 个字节。如果您只要求接收 1 个字节,那么您总是会得到 1 个字节(除非连接已关闭)。

然而,这是低效的,因为接收函数使用一定量的 CPU 时间来处理您想要接收的事实 - 即函数调用本身会花费一些 CPU 时间。如果您一次请求 100000 个字节,那么您不必调用接收函数 100000 次来获取它。它可能对你来说已经足够快了,只是没有它可能的那么快。

【讨论】:

    【解决方案2】:

    虽然这不是好的做法,但它并不是“浪费”。操作系统上的大多数套接字实现都使用套接字缓冲区,范围从 4K 到 6MB。所以是的,你可以,只要你读得足够快。 但是,将 stuf 复制到您自己的内存管理缓冲区仍然是一种节省。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 2013-12-07
      相关资源
      最近更新 更多