クラスA、クラスB、クラスCのIPアドレスを元にビット演算し、
各ネットワークアドレスを求めるプログラム。
\は¥の半角と一緒です。
(UTF-8は¥がバックスラッシュとして表示される。
/と間違えないように注意)
C:\perl_lerningとかいうフォルダがWWWの公開フォルダになってると思うから
C:\perl_lerningの下にcgi-binフォルダを作る。
C:\perl_lerning\cgi-binになると思う。
cgi-lib.plをC:\perl_lerningの中に入れる。
C:\perl_lerningの中にIPを入力するためのフォームがあるHTMLを作成する。
====
cgi1.html====
<HTML>
<HEAD>
<TITLE>CGIプログラミングの課題1</TITLE>
</HEAD>
<BODY>
<FORM METHOD="POST" ACTION="cgi-bin/cgi1.cgi">
クラスAのIP
<INPUT TYPE="text" NAME="a1" SIZE="3" VALUE="" />
<INPUT TYPE="text" NAME="a2" SIZE="3" VALUE="" />
<INPUT TYPE="text" NAME="a3" SIZE="3" VALUE="" />
<INPUT TYPE="text" NAME="a4" SIZE="3" VALUE="" /><BR />
クラスBのIP
<INPUT TYPE="text" NAME="b1" SIZE="3" VALUE="" />
<INPUT TYPE="text" NAME="b2" SIZE="3" VALUE="" />
<INPUT TYPE="text" NAME="b3" SIZE="3" VALUE="" />
<INPUT TYPE="text" NAME="b4" SIZE="3" VALUE="" /><BR />
クラスCのIP
<INPUT TYPE="text" NAME="c1" SIZE="3" VALUE="" />
<INPUT TYPE="text" NAME="c2" SIZE="3" VALUE="" />
<INPUT TYPE="text" NAME="c3" SIZE="3" VALUE="" />
<INPUT TYPE="text" NAME="c4" SIZE="3" VALUE="" /><BR />
<INPUT TYPE="submit" VALUE="送信" />
</FORM>
</BODY>
</HTML>
========
<FORM METHOD="POST" ACTION="cgi-bin/cgi1.cgi">
POSTでcgi-bin/cgi1.cgiにデータを送信する。
クラスAのIPの1オクテット目の値をa1としてPOST送信。
クラスAのIPの2オクテット目の値をa2としてPOST送信。
~~~略
クラスCのIPの3オクテット目の値をc3としてPOST送信。
クラスCのIPの4オクテット目の値をc4としてPOST送信。
CGI側でa1とかa2という名前で値を受け取る。
次に、C:\perl_lerning\cgi-binの中に、
フォームで送信したデータを受け取って、
ネットワークアドレスを求めて表示するcgiプログラムを作る。
====cgi1.cgi====
require 'cgi-lib.pl';
&ReadParse;
print "Content-type: text/html\n\n";
print "<html>";
print "<body>";
$a1 = $in{"a1"} & 255;
$a2 = $in{"a2"} & 0;
$a3 = $in{"a3"} & 0;
$a4 = $in{"a4"} & 0;
print $a1 . "." . $a2 . "." . $a3 . "." . $a4 . "<br>\n";
$b1 = $in{"b1"} & 255;
$b2 = $in{"b2"} & 255;
$b3 = $in{"b3"} & 0;
$b4 = $in{"b4"} & 0;
print $b1 . "." . $b2 . "." . $b3 . "." . $b4 . "<br>\n";
$c1 = $in{"c1"} & 255;
$c2 = $in{"c2"} & 255;
$c3 = $in{"c3"} & 255;
$c4 = $in{"c4"} & 0;
print $c1 . "." . $c2 . "." . $c3 . "." . $c4 . "<br>\n";
print "</body>";
print "</html>";
========
#!c:/perl/bin/perl.exe
CGIでPerlを使うためにパスを指定する。
require 'cgi-lib.pl';
cgi-lib.plを読み込む。
&ReadParse;
配列にPOSTで送信されたデータを突っ込む。
データを取りだすときには、
$in{フォームのname=のとこの値}って感じ。
さっきのフォームのname="a1"の部分であれば、
$in{"a1"}
とすればOK。
print "Content-type: text/html\n\n";
print "<html>";
print "<body>";
HTML部分。Content-(ryって部分がないとエラーが起きる。
$a1 = $in{"a1"} & 255;
クラスAはサブネットが255.0.0.0で、1オクテット目は
255である。
$in{"a1"}の部分は、HTMLのフォームの
name="a1"部分に入力した値になる。
&はビット演算の論理積を計算する。
$in{"a1"} & 255; これで、HTMLで
name="a1"に入力したクラスAの1オクテット目の数値と
255の論理積が計算できる。
$a1 = $in{"a1"} & 255;
論理積を計算したら、$a1に結果を代入する。
$a2 = $in{"a2"} & 0;
上に同じく、クラスAの2オクテット目の部分を
255との論理積で計算し、結果を$a2の変数に代入する。
$a3と$a4は省略。
print $a1 . "." . $a2 . "." . $a3 . "." . $a4 . "<br>\n";
printで表示するが、文字列をくっつけるところがちょっと違う。
.(ドット)は、文字列をくっつける。
print "a" . "b"; とすると、 ab と表示される。
"." は、IPアドレスの区切りを文字列としてくっつけている。
$a1と.と$a2と.と$a3と.と$a4をくっつけて表示してるわけだ。
仮に$a1に10、$a2に0、$a3に0、$a4に0が入っていたら、
print "10.0.0.0"; と同じことになる。
.は文字列をくっつける演算子だが、"."は
文字として扱うから、そのまま表示される。
$b1~$b4と$c1~$c4も、同じものの繰り返し。
print "</body>";
print "</html>";
最後にHTMLの閉じタグを表示させて糸冬。