#!/usr/local/bin/perl #!D:/Perl/bin/perl.exe # Webページ表示チェックプログラムその1(Socketモジュール使用例) # SOCKEThttp1.pl 2002.08.17 作成:鷹の巣 http://sakaguch.com/ # 参考URL # 説明が豊富なURL:http://x68000.q-e-d.net/~68user/net/http-2.html # 説明が豊富なURL:http://ash.or.jp/perl/socket_http.htm #■□■ URLの設定 ■□■ $url = 'http://example.com/'; # アクセスするURL $http_version = '1.1'; # HTTPプロトコル(Hypertext Transfer Protocol)の改版番号 #■□■ URLの設定終わり ■□■ use Socket; # Socketモジュールを使用 &main(); # perlで、URLを閲覧 exit; sub main { &get($url, $http_version); # $urlに設定したURLのWebページを標準出力(HTTPクライアント) } sub get { my ($url, $http_version) = @_; # 引数0:URI、引数1:HTTPプロトコルのバージョン $url =~ /(http:)?(\/\/)?([^:\/]*)?(:([0-9]+))?(\/.*)?/; my $host = $3; if ($host eq "") {$host = 'localhost';} my $port = $5; if ($port eq "") {$port = 80;} # HTTPプロトコルgetservbyname('http','tcp')は80。 my $path = $6; if ($path eq "") {$path = '/';} my $ip_addr = inet_aton($host) || die "$hostは存在しないホストです。\n";# ホスト名をIPアドレスの構造体に変換 my $socket_addr = pack_sockaddr_in($port, $ip_addr); # ポート番号とIP アドレスを構造体に変換 my $protocol = getprotobyname('tcp'); # プロトコル番号 socket(SOCKET_HANDLE, PF_INET, SOCK_STREAM, $protocol) || die "ソケットを生成できません。\n";# ソケット生成 connect(SOCKET_HANDLE, $socket_addr) || die "$hostのポート$portに接続できません。\n";# 指定のホストの指定のポートに接続 select(SOCKET_HANDLE); $|=1; select(STDOUT); # ファイルハンドルSOCKET_HANDLEをバッファリングしない # autoflush SOCKET_HANDLE (1); # 同上。使用時は、use IO::Socket;かuse FileHandle;を宣言。 if ($http_version eq '1.1') { # WWWサーバにHTTPリクエストを送る print SOCKET_HANDLE "GET $path HTTP/1.1\r\n"; print SOCKET_HANDLE "Host: $host\r\n"; print SOCKET_HANDLE "Connection: close\r\n"; } else { print SOCKET_HANDLE "GET $path HTTP/1.0\r\n"; } print SOCKET_HANDLE "\r\n"; while (){ m/^\r\n$/ and last; } # ヘッダ部分を除去する(改行のみの行ならループを抜ける) print ; # HTTP応答を(ヘッダも含めて)受信して表示 close (SOCKET_HANDLE); # 切断 }