2014-04-03 22 views
0

我即将失去它在这里,我想发送两个HTTP 1.1来获取我的一些网页的源代码(我不想使用LWP),只有第一个工作,即使当我切换为了,所以从理论上讲这两项请求都很好,这里是我做的:两个HTTP 1.1请求(一个不工作)?

我甚至创造了两个插座,以防万一,但同样的结果...

my $sock = IO::Socket::INET->new(
       PeerAddr => $dom, 
       PeerPort => 'http(80)', 
       Proto => 'tcp' 
      ) 
      or die "Could not connect to :80!! $!"; 

my $sock2 =  IO::Socket::INET->new(
       PeerAddr => $dom, 
       PeerPort => 'http(80)', 
       Proto => 'tcp' 
      ) 
      or die "Could not connect to :80!! $!";   


my $req2 = << 'EOT' 
POST/HTTP/1.1 
Host: $dom 
Connection: keep-alive 
Content-Length: 57 
Cache-Control: max-age=0 
Origin: ${org} 
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36 
Content-Type: application/x-www-form-urlencoded 
Referer: ${ref} 


EOT 
; 




my $req = << 'EOT' 
POST/HTTP/1.1 
Host: $dom 
Connection: keep-alive 
Content-Length: 57 
Cache-Control: max-age=0 
Origin: ${org} 
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36 
Content-Type: application/x-www-form-urlencoded 
Referer: ${ref} 


EOT 
;   



$sock2->send($req2); 


sleep 5; 


my $abc; 
while(<$sock2>) { 
     print $_; 
    } 


$sock->send($req); 


sleep 5; 


while(<$sock>) { 
     print $_; 
    } 

哪里似乎是问题吗?

在此先感谢。

+2

调试提示:在发送请求之前打印出请求。你会发现你应该为你的请求使用双引号字符串,这样变量就可以插入→'<<“EOT”'。此外,我觉得你缺乏明确的'\ r \ n'结尾令人不安。生产力小窍门:严格地说,只需使用['LWP :: UserAgent'](https://metacpan.org/pod/LWP::UserAgent)代替HTTP请求的裸套接字。 LWP有什么问题? – amon

+0

LWP说实话,没有什么不对,它只是慢了一点,因为有时我需要检查多个页面,并且使用HTTP 1.1我不必等待答案,这是我所知道的。 – Mugiwara

+1

谁告诉你这是错的。与您的代码相反,LWP确实使用HTTP/1.1并理解HTTP/1.1响应。 –

回答

4

您与发送HTTP/1.1请求保持活动(这是隐含的与HTTP/1.1,所以你可以跳过连接头)。但是,您不会尝试解析HTTP响应,只是假设请求完成后会关闭连接。这显然是错误的。

我真的建议你使用像LWP,HTTP :: Tiny这样的已建立的HTTP库,而不是单独尝试。如果您确实想要这样做,请阅读相关标准,例如RFC 2616,它解释了你简单忽略的所有重要内容:http响应头和主体,内容长度与分块编码,内容编码等。HTTP/1.1并不那么简单 - 如果你想简单地使用HTTP/1.0并且做不使用保持活着。

0

我不确定,但是在第一次发送之后实例化第二个套接字时,重新实例化它的第一个套接字它起作用,起初我以为是因为我没有关闭第一个套接字,但即使是那个close($socket)它不工作,除非我用这样的:

my $sock = IO::Socket::INET->new(
       PeerAddr => $dom, 
       PeerPort => 'http(80)', 
       Proto => 'tcp' 
      ) 
      or die "Could not connect to :80!! $!"; 


my $req2 = <<"EOT" 
POST/HTTP/1.1 
Host: $dom 
Connection: keep-alive 
Content-Length: 57 
Cache-Control: max-age=0 
Origin: ${org} 
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36 
Content-Type: application/x-www-form-urlencoded 
Referer: ${ref} 


EOT 
; 




my $req = <<"EOT" 
POST/HTTP/1.1 
Host: $dom 
Connection: keep-alive 
Content-Length: 57 
Cache-Control: max-age=0 
Origin: ${org} 
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36 
Content-Type: application/x-www-form-urlencoded 
Referer: ${ref} 


EOT 
;   



my $sock2 =  IO::Socket::INET->new(
       PeerAddr => $dom, 
       PeerPort => 'http(80)', 
       Proto => 'tcp' 
      ) 
      or die "Could not connect to :80!! $!";   

$sock2->send($req2); 


sleep 5; 


my $abc; 
while(<$sock2>) { 
     print $_; 
    } 


$sock->send($req); 


sleep 5; 


while(<$sock>) { 
     print $_; 
    }