我即将失去它,我正在尝试发送两个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 $_;
}
哪里似乎有问题?
提前致谢。
答案 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)