2011-11-16 42 views
1

我正在编写一个浏览器,它发送http获取请求的方式与浏览器所做的相同。我想测试的“保持活动”头,所以我发送和接收以下封装两次:HTTP套接字保持活着不起作用

 
"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错误)。似乎服务器拒绝向我发送数据。

这是什么问题?

+3

您是否检查过来自服务器的响应,其标头是否也有保持活动状态?另外请记住,服务器上的超时时间可能只有几秒钟。 –

+0

您在“HTTP/1.1”请求的第一行中缺少“/”。你的内容之前还有一个额外的“\ r \ n” - 你有两个空白行而不是一个。因此,你身体的实际内容长度是19,而不是17;那么服务器可能会尝试解析下一个请求,就好像它以“st”开始一样,这是第一个请求结束时的额外两个字符。 –

+0

你有什么尝试?服务器似乎在您的本地网络上,所以您应该能够检查其日志。你有没有看到任何错误?第一个请求的回应是什么?像Fiddler这样的工具对你的请求有什么看法,它们是否有效(根据其他评论者的看法,它不是那么有效)?服务器是否配置为永不履行keepalive(因为它可能会忽略标题并使用'Connection:close'来响应并且这样做)? – CodeCaster

回答

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对,你应该没问题。

Btw,Keep-Alive是HTTP 1.1中Connection-Type的默认值,因此您甚至不需要明确指定。