两个HTTP 1.1请求(一个不起作用)?

时间:2014-04-03 23:39:11

标签: perl io-socket

我即将失去它,我正在尝试发送两个HTTP 1.1来获取我的一些网页的源代码(我不想使用LWP),只有第一个工作,即使我切换顺序,所以理论上两个请求都很好,这就是我的工作:

我甚至创建了两个套接字以防万一,但结果相同......

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 个答案:

答案 0 :(得分:4)

您发送带有keep-alive的HTTP / 1.1请求(这是HTTP / 1.1隐含的,因此您可以跳过Connection标头)。但是,您没有尝试解析HTTP响应,只是假设它将在请求完成时关闭连接。这是完全错误的。

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

答案 1 :(得分:0)

我不确定,但是当在第一次发送之后实例化第二个套接字时,重新实例化第一个套接字它确实有效,起初我以为是因为我没有关闭第一个套接字,但即使是那个{{除非我像这样使用它,否则它不起作用:

close($socket)