• 締切済み

Socketに関して

SocketでURLで指定されたバナーを一旦ダウンロードし、 画像サイズを取得するプログラムなのですが、 以下のソースでは、画像が存在するURLを指定しても 「バナ-画像が存在しません。バナ-URLを確認してください。」 となってしまいます。 どこが不具合なのか分かる方がいらっしゃれば教えて頂けないでしょうか? サーバーは「land.to」です。 use Socket; sub GetBannerSize{ #バナ-サイズ取得(sock接続) my ( $url ) = @_; my ( $host, $port, $path, $dir, $file, $base, $ext, $width, $height, $ipaddr, $sockaddr, $tmpimg, $data ); $url =~ /(http:)?(\/\/)?([^:\/]*)?(:([0-9]+))?(\/.*)?/; $host = $3; if ($host eq "" || $host eq $ENV{'SERVER_NAME'}) {$host = 'localhost';} $path = $6; if ($path eq "") {$path = '/';} if ($path =~ /(.*)\/(.*)/) { $dir = $1.'/'; $file = $2; } else { $dir = './'; $file = $path; } if ($file =~ /(.*)\.(.*)/) { $base = $1; $ext = $2; } else { # 拡張子なし $base = $file; $ext = ""; } $port = getservbyname("http", "tcp"); $ipaddr = inet_aton($host) || &error("host($host) not found."); $sockaddr = pack_sockaddr_in($port, $ipaddr); socket(SOCK, PF_INET, SOCK_STREAM, 0) || &error("socket error."); connect(SOCK, $sockaddr) || &error("connect $host $port error."); select(SOCK); $|=1; select(STDOUT); print SOCK << "END_OF_DOC"; GET $path HTTP/1.0 Host:$host Connection:close END_OF_DOC while(<SOCK>){ last if m/^\r\n$/; } $tmpimg = ""; if ($ext eq "gif") { $tmpimg = "./temp/tmp.gif"; }elsif ($ext eq "jpg" || $ext eq "jpeg") { $tmpimg = "./temp/tmp.jpg"; }elsif ($ext eq "png") { $tmpimg = "/temp/tmp.png"; }else{ &error("画像形式が正しくありません。"); } open(OUT,">$tmpimg"); while (<SOCK>) { if ($_ =~ /<HTML>/i) { &error("バナ-画像が存在しません。バナ-URLを確認してください。"); } print OUT $_; } close(OUT); close SOCK; $width = 0; $height = 0; if ($ext eq "gif") { open(IN,"$tmpimg") || return (0,0); binmode(IN); sysread(IN,$data,10); close(IN); if ($data =~ /^GIF/) { $data = substr($data,-4); } $width = unpack("v",substr($data,0,2)); $height = unpack("v",substr($data,2,2)); } elsif ($ext eq "jpg" || $ext eq "jpeg") { local($t, $m, $c, $l); open(IN,"$tmpimg") || return (0,0); binmode(IN); read(IN, $t, 2); while (1) { read(IN, $t, 4); ($m, $c, $l) = unpack("a a n", $t); if ($m ne "\xFF") { $W = $H = 0; last; } elsif ((ord($c) >= 0xC0) && (ord($c) <= 0xC3)) { read(IN, $t, 5); ($height, $width) = unpack("xnn", $t); last; } else { read(IN, $t, ($l - 2)); } } close(IN); } elsif ($ext eq "png") { open(IN,"$tmpimg") || return (0,0); binmode(IN); read(IN, $data, 24); close(IN); $width = unpack("N", substr($data, 16, 20)); $height = unpack("N", substr($data, 20, 24)); } unlink $tmpimg; return( $width, $height ); }

みんなの回答

  • maura
  • ベストアンサー率46% (48/104)
回答No.2

while(<SOCK>){ print $_; # 追加 last if m/^\r\n$/; } while (<SOCK>) { print $_; # 追加 if ($_ =~ /<HTML>/i) { &error("バナ-画像が存在しません。バナ-URLを確認してください。"); } print OUT $_; } print 文を追加して実行すると どのような出力がありますか? 何かの手がかりにはなると思います。 インターネットへの接続は、"Proxyなし"でこちらは 確認しています。

das_horn
質問者

お礼

ご回答ありがとうございます。 エラーが出て試すことが出来ませんでした。

  • maura
  • ベストアンサー率46% (48/104)
回答No.1

このソースで問題なく動作しました。 注意点は GET $path HTTP/1.0 Host:$host Connection:close の行は前にタブやスペースをつけないこと もしつけるなら    print SOCK "GET $path HTTP/1.0\r\n";    print SOCK "Host:$host\r\n";    print SOCK "Connection:close\r\n";    print SOCK "\r\n"; とする以外ないです

das_horn
質問者

お礼

ご回答ありがとうございます。 ご指摘のように、タブやスペースはつけていないのですがダメです。 サーバー環境の違いでしょうか?

関連するQ&A