【发布时间】:2012-10-17 15:26:59
【问题描述】:
我正在编写一个发送 http get 请求的浏览器,其构造方式与浏览器相同。我想测试“keep-alive”标头,所以我发送和接收以下包两次:
"POST /test.php HTTP1.1\r\n" “主机:192.168.0.1:8000\r\n” "连接:保持活动\r\n" "内容长度: 17\r\n" “内容类型:应用程序/x-www-form-urlencoded\r\n” "接受语言: en-US,en;q=0.8\r\n" "接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n" “用户代理:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2\r\n” "接受: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" “引用者:http://192.168.0.1:8000/test.php\r\n” "接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n" “\r\n\r\n” “参数:test_tst_tst”但是,当我第二次收到时,我收到错误 10054(Windows 错误)。似乎服务器拒绝向我发送数据。
这有什么问题?
【问题讨论】:
-
您是否检查了服务器的响应,它的标头也设置了保持活动状态?另请记住,服务器上的超时可能只有几秒钟。
-
您在请求“HTTP/1.1”的第一行中缺少“/”。你的内容前还有一个额外的“\r\n”——你有两个空行,而不仅仅是一个。因此,您正文的实际内容长度是 19,而不是 17;然后服务器可能会尝试解析下一个请求,就好像它以“st”开头,即第一个请求末尾的额外两个字符。
-
你试过什么?该服务器似乎在您的本地网络上,因此您应该能够检查其日志。你看到任何错误吗?第一个请求的响应是什么?像 Fiddler 这样的工具对您的请求有什么看法,它们是否有效(根据其他评论者的说法,似乎不是这样)?服务器是否配置为从不支持keepalives(因为它可能会忽略标头并以
Connection: close响应并这样做)?
标签: http sockets keep-alive