我想知道如何从套接字接收到所有数据。这是一个简单的Web代理,现在我正在处理请求部分,所以发送的内容应该以'\ r \ n \ r \ n'结尾。我不知道请求会有多长时间。我读过这里的一些帖子,说我应该检查0从读功能返回?但其他人说0只会在客户端关闭连接时返回?否则,我可以检查缓冲区的最后一个字符,看看它们是否与上面的符合?从套接字读取C HTTP
该计划只是将读取的数据加载到缓冲区,保存该数据,如果有更多的数据重复。
谢谢
我想知道如何从套接字接收到所有数据。这是一个简单的Web代理,现在我正在处理请求部分,所以发送的内容应该以'\ r \ n \ r \ n'结尾。我不知道请求会有多长时间。我读过这里的一些帖子,说我应该检查0从读功能返回?但其他人说0只会在客户端关闭连接时返回?否则,我可以检查缓冲区的最后一个字符,看看它们是否与上面的符合?从套接字读取C HTTP
该计划只是将读取的数据加载到缓冲区,保存该数据,如果有更多的数据重复。
谢谢
我觉得你的计划几乎是正确的。您需要继续将读取的数据加载到缓冲区中,直到找到所需的模式'\r\n\r\n'
,然后您知道您拥有完整的请求并可将其传递到您的处理逻辑,从缓冲区中移除请求并重复。
这取决于您是否处于阻塞或非阻塞套接字。
我刚刚使用了伯克利套接字的默认值,我不确定那是阻塞还是非阻塞? – drunkmonkey 2012-02-23 19:14:29
在EAGAIN的情况下返回-1,而不是0. recv/read/recvmsg返回0意味着另一端关闭了TCP连接。 – nos 2012-02-23 20:48:21
@drunkmonkey默认为阻塞。 – EJP 2012-02-24 09:05:00
不,你不知道。 \ r \ n \ r \ n终止标题。正文通过其Content-Length或其分块的终止,或仅通过HTTP 1.0中的EOS终止。 – EJP 2012-02-24 00:01:42