【问题标题】:HTTP socket keep-alive not workingHTTP套接字保持活动不起作用
【发布时间】: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


【解决方案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 的默认值,因此您甚至不需要明确指定。

【讨论】:

    猜你喜欢
    • 2014-03-19
    • 2019-12-18
    • 1970-01-01
    • 2011-07-03
    • 2010-09-23
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多