HTTP套接字保持活动状态不工作

HTTP套接字保持活动状态不工作,http,sockets,keep-alive,Http,Sockets,Keep Alive,我正在编写一个浏览器,它以与浏览器相同的方式发送http get请求。我想测试“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

我正在编写一个浏览器,它以与浏览器相同的方式发送http get请求。我想测试“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" “POST/test.php HTTP1.1\r\n” “主机:192.168.0.1:8000\r\n” “连接:保持活动\r\n” “内容长度:17\r\n” “内容类型:application/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,如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” “第段:测试” 但是,当我第二次收到时,我得到错误10054(windows错误)。似乎服务器拒绝向我发送数据


这有什么问题吗?

我想您所说的错误10054是错误

您的问题是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"
引述自:

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

删除一对
\r\n
就可以了


顺便说一句,
Keep Alive
是HTTP 1.1中
连接类型的默认值,因此您甚至不需要明确指定该值。

我猜您所说的错误10054就是错误

您的问题是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"
引述自:

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

删除一对
\r\n
就可以了


顺便说一句,
Keep-Alive
是HTTP 1.1中
连接类型的默认值,因此您甚至不需要明确指定该值。

您是否检查了服务器的响应,其标头也设置了Keep-Alive?还要记住,服务器上的超时时间可能只有几秒钟。您在请求“HTTP/1.1”的第一行中缺少“/”。您的内容前面还有一个额外的“\r\n”——您有两个空行而不是一个。因此,你身体的实际内容长度是19,而不是17;然后,服务器可能会尝试解析下一个请求,就像它以“st”开头一样,这是第一个请求末尾额外的两个字符?服务器似乎位于您的本地网络上,因此您应该能够检查其日志。你看到错误了吗?第一个请求的响应是什么?像Fiddler这样的工具对你的请求说了什么,它们是否有效(根据其他评论,似乎不是这样)?服务器是否配置为从不接受keepalives(因为它可能会忽略标头并使用
连接进行响应:关闭
并执行此操作)?您是否检查了服务器的响应,其标头也设置了keep-alive?还要记住,服务器上的超时时间可能只有几秒钟。您在请求“HTTP/1.1”的第一行中缺少“/”。您的内容前面还有一个额外的“\r\n”——您有两个空行而不是一个。因此,你身体的实际内容长度是19,而不是17;然后,服务器可能会尝试解析下一个请求,就像它以“st”开头一样,这是第一个请求末尾额外的两个字符?服务器似乎位于您的本地网络上,因此您应该能够检查其日志。你看到错误了吗?第一个请求的响应是什么?像Fiddler这样的工具对你的请求说了什么,它们是否有效(根据其他评论,似乎不是这样)?服务器是否配置为从不接受keepalives(因为它可能会忽略标头并使用
连接进行响应:关闭
并执行此操作)?