2011-09-30 100 views
4

我已经写了一个C程序,它向网络服务器发送一个HTTP 1.1 POST请求。
对Wireshark进行监控,服务器响应并获取HTTP/1.1 200 OK消息的时间少于一秒,但是接着需要20秒才能获取FIN, ACK数据包,我相信这是导致recv返回0的原因,指定没有更多的数据。
导致我的程序挂起20秒,它等待服务器发送FIN, ACK数据包。HTTP 1.1与HTTP 1.0相比,延迟了20秒

我已经用HTTP 1.0测试过了,并且没有延迟。所以我认为这是因为默认情况下HTTP 1.1认为所有连接都是persistent connections
但我的网络浏览器使用HTTP 1.1并没有任何延迟,所以我认为我没有做正确的事情。

我有一个想法是,而不是等待recv返回0,我要检查,如果我在文件末尾一些其他的方式,但我想不出任何办法做到这一点。

所以如果有人能向我解释我应该怎么做?提前致谢。

+0

我想我们需要看到一些代码...你打开和维修套接字如何?安迪袜子的选择? – nhed

回答

6

HTTP 1.1默认为保持活动连接,而1.0不启用。您可以通过添加标头来请求非保持活动

Connection: close 

指示服务器在完成后立即关闭连接。

+0

这可以修复延迟,但是如果我想利用保持活动连接的话会怎么样。如何在停止调用'recv'之前知道我是否收到了所有的数据? – Josh

+4

您现在要么是由于Content-Length标题,要么是通过对分块编码信息进行解码。 – johannes

+0

总之,正确处理HTTP 1.1要复杂得多。 – morningstar