从套接字 C 读取 HTTP headers
Reading HTTP headers from socket C
我的问题主要是教育性的,所以请不要告诉我你不应该那样做或者你应该那样做。谢谢
这基本上是关于 TCP 的工作原理。
我正在用 C 实现一个 HTTP 客户端,它基本上只是发送 HTTP GET 并从服务器读取响应。现在我想将 headers 与 body 分开。问题是,是否可以从套接字读取 byte-by-byte:
while(recv(sockfd, buffer, 1, 0))
{
// do whatever with buffer[0]
}
或者是这样的:一旦服务器写入套接字,比如说 1000 字节,那么一旦客户端读取了 1 个字节,那么所有这些消息都被“浪费”了并且无法再被读取?
因为我记得在过去的某个时候处理套接字时,我就是这样理解它正在工作的。
虽然这不是很好的做法,但也不是“浪费”。 OS 上的大多数套接字实现都使用套接字缓冲区,范围从 4K 到 6MB。所以是的,你可以,只要你读得足够快。
但是,将 stuf 复制到您自己的内存管理缓冲区中仍然更省事..
是的,在 TCP 中这是可能的。 TCP 没有消息,只有字节,就像文件一样。您可以发送 1000 个字节,然后接收 1 个字节 1000 次。
事实上,这是一种方便的开始方式,因为如果您尝试接收超过 1 个字节,您可能无法获得您要求的相同数量的字节,您可以接收到 1 个字节以下的任何数字。如果你只要求接收 1 个字节,那么你总是得到恰好 1 个字节(除非连接已关闭)。
然而,它是低效的,因为接收函数使用一定数量的 CPU 时间来处理您想要接收的事实 - 即函数调用本身花费了一点 CPU 时间。如果您一次请求 100000 个字节,那么您不必调用接收函数 100000 次来获取它。它可能对你来说足够快,只是没有达到预期的那么快。
我的问题主要是教育性的,所以请不要告诉我你不应该那样做或者你应该那样做。谢谢
这基本上是关于 TCP 的工作原理。
我正在用 C 实现一个 HTTP 客户端,它基本上只是发送 HTTP GET 并从服务器读取响应。现在我想将 headers 与 body 分开。问题是,是否可以从套接字读取 byte-by-byte:
while(recv(sockfd, buffer, 1, 0))
{
// do whatever with buffer[0]
}
或者是这样的:一旦服务器写入套接字,比如说 1000 字节,那么一旦客户端读取了 1 个字节,那么所有这些消息都被“浪费”了并且无法再被读取?
因为我记得在过去的某个时候处理套接字时,我就是这样理解它正在工作的。
虽然这不是很好的做法,但也不是“浪费”。 OS 上的大多数套接字实现都使用套接字缓冲区,范围从 4K 到 6MB。所以是的,你可以,只要你读得足够快。 但是,将 stuf 复制到您自己的内存管理缓冲区中仍然更省事..
是的,在 TCP 中这是可能的。 TCP 没有消息,只有字节,就像文件一样。您可以发送 1000 个字节,然后接收 1 个字节 1000 次。
事实上,这是一种方便的开始方式,因为如果您尝试接收超过 1 个字节,您可能无法获得您要求的相同数量的字节,您可以接收到 1 个字节以下的任何数字。如果你只要求接收 1 个字节,那么你总是得到恰好 1 个字节(除非连接已关闭)。
然而,它是低效的,因为接收函数使用一定数量的 CPU 时间来处理您想要接收的事实 - 即函数调用本身花费了一点 CPU 时间。如果您一次请求 100000 个字节,那么您不必调用接收函数 100000 次来获取它。它可能对你来说足够快,只是没有达到预期的那么快。