はい。
秋の空にはまだまだ遠いですが、やっぱりもうちょいソケットの知識をかためたいなぁっつーことで、ついこないだまでC言語の基本に帰ろうかなぁ、やめようかなぁ、朝一の汽車に乗ってーなんて言ってたけど、そっちも同時進行にやっちゃえばいいさ。
復習は気がむいたときにやろう。え?
それがいい。
さて TCP/IP Socket in Perl ですが、Perlで書かれたコードは、ざっくりというか、ワイルドというか、太い棒で叩いている感じがする。
参考サイト
ネットワークプログラミングの基礎知識
こちらのサイトを参考にさせて頂いて、こちらのサイトのコンテンツを自分なりに書いてみたり、書籍のプログラムをがんばってPerlにしてみたりしたいと思います。
とりあえず手始めにHTTPクライアントをやってみる。
ソース
# HTTPクライアントです。 #!/usr/local/bin/perl use strict; use warnings; use Socket; use IO::Handle; # 接続先のURL print("接続先のURLを入力してください\n"); chomp(my $host = <STDIN>); #Get or Headdd print("HEADにする?それともGET?\n"); chomp(my $request = <STDIN>); # HTTPプロトコルを使う。 my $port = getservbyname('http', 'tcp'); # ソケットの生成 socket(SOCKET, PF_INET, SOCK_STREAM, 0) or die "socket failed\n"; # ドメインをIPアドレスの構造体へ変換。 my $addr = inet_aton($host) or die "$hostは解決できませぬん。\n"; # ポート番号とIPアドレスをSOCKADDR 構造体に変換。 my $sock_addr = pack_sockaddr_in($port, $addr); # コネクト connect(SOCKET, $sock_addr) or die "connect failed\n"; # Cで言うとfflush(stdout); SOCKET->autoflush; my $method; if($request eq "HEAD" || $request eq "head") { $method = "HEAD"; } elsif($request eq "GET" || $request eq "get") { $method = "GET"; } else { print "GETかHEADで決めてんか!!"; exit(1); } # HTTPリクエスト送信 print SOCKET "$method /index.html HTTP/1.0\n"; print SOCKET "\n"; if($method eq "GET") { while(<SOCKET>){ m/^\r\n$/ and last; } while(<SOCKET>){ print $_; } } else { while(<SOCKET>){ print $_; } }
なかなか出力されなくて困ったんだけど、ミソになってたのはSOCKET->autoflushとchompのところ。autoflushはC言語だとfflush、chompは行末の改行をとっぱらうものらしい。
もうすでに正規表現も出てきてるし、おそろしあ。
こんな感じになりました。
# perl http_client.pl [/root/program/http_client] 接続先のURLを入力してください biglobe.ne.jp HEADにする?それともGET? head HTTP/1.1 200 OK Date: Tue, 13 May 2014 12:35:01 GMT Server: httpd Last-Modified: Fri, 05 Sep 2008 07:44:53 GMT Accept-Ranges: bytes Content-Length: 254 X-XRDS-Location: https://openid.biglobe.ne.jp/server.xrds Connection: close Content-Type: text/html
ConnectやSocketの引数の数がちがってたり、いろいろと違うところはあるけど、すでに通った道はまだやりやすいね。
ファイルを読んでガツガツ正規表現を取り入れたようなPerlをやるよりも、こっちからのアプローチの方が自分には合ってるかなぁと思ったし。もっと基礎的な問題をやるのもソケットプログラムをやるのもそれほど変わらない。だもんでソケットを利用してCで勉強したことをPerlの入門に切り替えていくのもなかなかいいんじゃないかなとおもた。予定では夏頃にはC++やJAVAが始めれてたらなぁと。