2012-02-23 68 views
1

我想知道如何从套接字接收到所有数据。这是一个简单的Web代理,现在我正在处理请求部分,所以发送的内容应该以'\ r \ n \ r \ n'结尾。我不知道请求会有多长时间。我读过这里的一些帖子,说我应该检查0从读功能返回?但其他人说0只会在客户端关闭连接时返回?否则,我可以检查缓冲区的最后一个字符,看看它们是否与上面的符合?从套接字读取C HTTP

该计划只是将读取的数据加载到缓冲区,保存该数据,如果有更多的数据重复。

谢谢

回答

2

HTTP不是一个简单的协议,采取一些RFC文档。只匹配双份换行/新行将不会执行。最起码你必须解析请求头文件来找出那里有什么编码,然后,可选地,通过请求主体进行工作。

查看libcurl或任何可用的开源Web服务器来欣赏复杂性。

0

我觉得你的计划几乎是正确的。您需要继续将读取的数据加载到缓冲区中,直到找到所需的模式'\r\n\r\n',然后您知道您拥有完整的请求并可将其传递到您的处理逻辑,从缓冲区中移除请求并重复。

+0

不,你不知道。 \ r \ n \ r \ n终止标题。正文通过其Content-Length或其分块的终止,或仅通过HTTP 1.0中的EOS终止。 – EJP 2012-02-24 00:01:42

0

这取决于您是否处于阻塞或非阻塞套接字。

  • 如果您位于非阻塞套接字上,它可以返回0并将errno设置为EAGAIN。它只是意味着你必须再次尝试阅读
  • 如果你是一个阻止套接字上之前等待,0将指示文件结束
+0

我刚刚使用了伯克利套接字的默认值,我不确定那是阻塞还是非阻塞? – drunkmonkey 2012-02-23 19:14:29

+1

在EAGAIN的情况下返回-1,而不是0. recv/read/recvmsg返回0意味着另一端关闭了TCP连接。 – nos 2012-02-23 20:48:21

+0

@drunkmonkey默认为阻塞。 – EJP 2012-02-24 09:05:00