+ -
当前位置:首页 → 问答吧 → 请教:关于socket的问题

请教:关于socket的问题

时间:2010-08-06

来源:互联网

我有如下代码,这个代码可以正常的得到网页的内容,也就是文本内容。但却无法将二进制文件的内容读出,请问问题是出在请求方式还是读写方式上呢?能否给出正确的方式呢?我已经翻阅了好多资料,可是怎么改也不对。还望指教。

请求网页时是200,但是请求zip文件或者MP3时就变成400了。

代码如下:

#!perl!

#

use strict;
use IO::Socket qw(EFAULT :crlf);

my $data;

$/ = CRLF;

my ($host,$port,$path);
my $address_new = shift;
($host,$port,$path) = ($1,$2||80,$3) if($address_new =~ m!^(?:http://)?(.*?)(?:[0-9]+))?(/.*)$!x);

print "[$host] [$port] [$path]\n\n";

my $socket = IO::Socket::INET->new(

PeerAddr => $host,
PeerPort => $port,
Type     => SOCK_STREAM,
Timeout  => 20

) or die "Can't connect!";

print $socket "GET $path HTTP/1.1",CRLF,CRLF;
print $socket "HOSThostport";

my $out;

read ($socket,$out,1024);
print "$out\n";

close $socket;

作者: lanmeibanban   发布时间: 2010-08-06

本帖最后由 lanmeibanban 于 2010-08-06 17:33 编辑

晕,貌似又可以了。做了一些改动。主要是换行的。我是按perl网络编程里的格式写的。但是参考了网上perl http断点续传那个例子。将请求的头换行改了下。貌似能读了。。。。

代码如下:

#!perl!
#
use strict;
use IO::Socket qw(EFAULT :crlf);
my $data;
my ($host,$port,$path);
my $address_new = shift;
($host,$port,$path) = ($1,$2||80,$3) if($address_new =~ m!^(?:http://)?(.*?)(?:[0-9]+))?(/.*)$!x);
print "[$host] [$port] [$path]\n\n";
my $socket = IO::Socket::INET->new(
PeerAddr => $host,
PeerPort => $port,
Type     => SOCK_STREAM,
Timeout  => 20
) or die "Can't connect!";

print $socket "GET $path HTTP/1.1\n";
print $socket "HOSThost\n";
print $socket "Connection: close\n\n";

my $out;
sysread ($socket,$out,1024);
print "$out\n";
close $socket;

作者: lanmeibanban   发布时间: 2010-08-06

晕。怎么能不让表情显示出来。。。。好好的字符都成表情了。。不能不自动转换么?

作者: lanmeibanban   发布时间: 2010-08-06