Как лучше (желательно без модулей)
направить запрос и корректно все получить
У меня проблема с нахождением начала запрашиваемой картинки
"GET /1.gif HTTP/1.0"Точнее первий раз я все хорошо получаю (и распознаю) а последующие
рази что-то не так - может надо закривать поток или еще что...
Вот взгляните на ето:
------------------------------ CUT -------------------------------------
sub HTTPQuery()
{
# Ето все с соответствующей библиотеки!!!my $socket=IO::Socket::INET->new(
PeerAddr => (defined $_[0] ? $_[0] : ""),
PeerPort => (defined $_[1] ? $_[1] : "80"),
Proto => "tcp",
Type => SOCK_STREAM,
Timeout => $cfg_param{$HTTP_TIMEOUT}) || return "";
$socket->print($_[2]." ".$_[3]." HTTP/".$_[4]."\n\n");
return \$socket;
}sub GetBanner()
{
print "Content-type: text/html\n\n";my $a2="";
my $a3="";
if ($_[0] =~ /^(?:http:\/\/)?([^:\/\\]*)(?::(\d+))?(\/?[^\\]*)$/)
{
if (($fh=${&HTTPQuery($1,$2,"GET",$3,"1.0")}) eq "")
{ return 1; }
while (<$fh>)
{ $a2.=$_;
if ($_ =~ m/^[Cc]ontent-[Ll]ength:[\ ]*(\d+)/)
{ ${$_[1]}[0]=$1; }
if (($_ =~ m/^GIF8[7,9]a/) || ($_ =~ m/^\xFF\xD8/))
{ $q1=1;
}
if ($q1)
{ $a3.=$_; }
}
$fh2=IO::File->new_tmpfile || return 1;
$fh2->autoflush(1);print $fh2 $a3;
(${$_[1]}[2], ${$_[1]}[3], ${$_[1]}[4]) = &imgsize($fh2);# imgsize() - FROM LIBRARY - Работает отлично!!!
seek($fh2,0,0);
${$_[1]}[1] = crc32(*$fh2);
close($fh);
return 0;
}
else
{
return 1; #Error
}
}
# MAIN PROGRAM@fs=('http://192.168.11.4/real.gif','http://192.168.11.4/1.gif','http://192.168.11.4/3.gif');
print "Content-type: text/html\n\n";
foreach $i (@fs)
{
print "Result: [".&GetBanner($i,\@a1)."]\n";
print"Data:[".$a1[0]."-".$a1[1]."-".$a1[2]."-".$a1[3]."-".$a1[4]."]<br>\n";
}
exit 0;# а вот результати работи :
# Content-type: text/html Result: [0] Data: [4548 - 1291864271 - 42 - 37 # - JPG]
# Content-type: text/html Result: [0] Data: [267 - 2972524420 - - - Data # stream is not a known image file format]
# Content-type: text/html Result: [0] Data: [293 - 2778158077 - - -
# Datas tream is not a known image file format]
буду благодарен за подсказку.
А вот уже и ответ....------------------------------ CUT ------------------------------------
use Socket;
sub HTTPQuery()
{
unless (socket(HTTP, PF_INET, SOCK_STREAM, getprotobyname('tcp')))
{
#print("\n\n\n".(defined $_[0] ? $_[0] : "").":".(defined $_[1] ? $_[1] : "80")." ($!)\n");
return "";
}
select( (select(HTTP), $| = 1)[0] );unless (connect(HTTP, sockaddr_in((defined $_[1] ? $_[1] : "80"), inet_aton((defined $_[0] ? $_[0] : "")))))
{
#print("\n\n\n".(defined $_[0] ? $_[0] : "").":".(defined $_[1] ? $_[1] : "80")." ($!)\n");
return "";
}
print HTTP $_[2]." ".$_[3]." HTTP/".$_[4]."\nHost: ".(defined $_[0] ? $_[0] : "")."\n\n";
$answer = <HTTP>;
($status, $reason) = ($answer =~ m!HTTP/1.[01] (\d+) (.*)!);
unless ($status == 200)
{
#print("\n\n\n".(defined $_[0] ? $_[0] : "").":".(defined $_[1] ? $_[1] : "80")." ($!)\n");
return "";
}
while (<HTTP>)
{
${$_[5]}=$1 if /^[Cc]ontent-[Ll]ength:[\ ]*(\d+)/;
last if /^\s*$/;
}
return \HTTP;
}sub GetBanner()
{
print "Content-type: text/html\n\n";my $a2="";
my $a3="";
if ($_[0] =~ /^(?:http:\/\/)?([^:\/\\]*)(?::(\d+))?(\/?[^\\]*)$/)
{
if (($fh=${&HTTPQuery($1,$2,"GET",$3,"1.0",\${$_[1]}[0])}) eq "")
{ return 1; }
while (<$fh>)
{
if (($_ =~ m/^GIF8[7,9]a/) || ($_ =~ m/^\xFF\xD8/))
{ $q1=1; }
if ($q1)
{ $a3.=$_; }
}
$fh2=IO::File->new_tmpfile || return 1;
$fh2->autoflush(1);
print $fh2 $a3;
(${$_[1]}[2], ${$_[1]}[3], ${$_[1]}[4]) = &imgsize($fh2);
seek($fh2,0,0);
${$_[1]}[1] = crc32(*$fh2);
close($fh);
return 0;
}
else
{
return 1; #Error
}
}
....... а дальше все как обично .........РАБОТАЕТ!!!