HTTP套接字keep-alive无法正常工作

时间:2011-11-16 08:10:35

标签: http sockets keep-alive

我正在编写一个浏览器,它发送的http请求构建方式与浏览器相同。我想测试“keep-alive”标题,所以我发送并接收以下包两次:

"POST /test.php HTTP1.1\r\n"
"Host: 192.168.0.1:8000\r\n"
"Connection: keep-alive\r\n"
"Content-Length: 17\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"Accept-Language: en-US,en;q=0.8\r\n"
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n"
"User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2\r\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
"Referer: http://192.168.0.1:8000/test.php\r\n"
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n"
"\r\n\r\n"
"para:test_tst_tst"

然而,当我第二次收到时,我收到错误10054(Windows错误)。好像服务器拒绝向我发送数据。

这有什么不妥?

1 个答案:

答案 0 :(得分:1)

我猜你所说的错误10054是Winsock error "Connection reset by peer"

你的问题是你在http标题和正文之间有3 \r\n对,而不仅仅是2

"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n"
"\r\n\r\n"
"para:test_tst_tst"

引自the spec

generic-message = start-line
                  *(message-header CRLF)
                  CRLF
                  [ message-body ]

因此,服务器将读取第三个\r\n对作为正文的前2个字节,然后读取Content-Length标头中指定的17个字节长度的剩余部分。因此,不是从POST开始,而是将第二个请求解释为以stPOST开头,这可能会使服务器感到困惑。

删除一个\r\n对,你应该没问题。

顺便说一下,Keep-Alive是HTTP 1.1中Connection-Type的默认值,因此您甚至不需要明确指定。{/ p>