2014-04-03 49 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 $_; 
    }