やっぱりもうちょいソケットをやろう。PerlでやればPerlも覚えて一石二鳥だし。

はい。

秋の空にはまだまだ遠いですが、やっぱりもうちょいソケットの知識をかためたいなぁっつーことで、ついこないだまで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が始めれてたらなぁと。

Similar Posts:


Leave a Reply

Your email address will not be published. Required fields are marked *