我正在编写一个浏览器,它发送的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错误)。好像服务器拒绝向我发送数据。
这有什么不妥?
答案 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>