簡単なTCPサーバとクライアント
ここでは、Perlを使った簡単なTCPサーバとクライアントの例を紹介したいと思います。
簡単なTCPサーバ
以下に単純なTCPサーバを示します。 「#!/usr/bin/perl」の行は環境に応じて変更してください。 もし、/usr/bin/perlにperlが無い場合は「#!/usr/local/bin/perl」にあることが多いと思います。 UNIX系環境(Linux含む)では、「which perl」とやるとperlへのパスがわかります。 「which perl」を実行しても無い場合には、perlがインストールされていないかパスが通していないかのどちらかを疑ってみてください。
#!/usr/bin/perl
use IO::Socket;
$sock0 = new IO::Socket::INET(Listen=>5,
LocalAddr=>'localhost',
LocalPort=>12345,
Proto=>'tcp',
Reuse=>1);
die "IO::Socket : $!" unless $sock0;
$sock = $sock0->accept();
print $sock "HELLO\n";
close($sock);
close($sock0);
exit;
上記サーバは、TCPの12345番ポートでTCPのコネクションを待ちうけ、コネクションを確立すると「HELLO」という文字列をクライアントに送信します。 このTCPサンプルサーバは、後に説明する「簡単なTCPクライアント」と通信できるように作成されています。 (このTCPサンプルサーバは、winsock説明で紹介しているTCPクライアントサンプルとも通信できます。)
IO::Socketを使うと、非常に簡単にTCPサーバが作成できます。 上記例では、以下の設定でTCPコネクション受付ソケットを作成しています。
- TCPによる待ちうけポートは12345
- TCPを使う(ProtocolはTCP)
- localhostにbindする
- acceptせずに保持できるTCPコネクション数は5個(listenに渡す引数は5)
- SO_REUSEADDRを有効にする(Reuse=>1)
とりあえず、ここで重要なのは「TCPによる待ちうけポートは12345」「TCPを使う」「localhostにbindする」の3つです。 それ以外の2つの意味がわからない場合には、あまり気にしないでください。 複雑な事をするつもりがないのであれば「Listen=>5」はおまじないだと思って書いても問題ないですし、「Reuse=>1」はあっても無くても大丈夫です。
簡単なTCPクライアント
以下に、簡単なTCPクライアントのサンプルを示します。 下記サンプルは、前述した単純なTCPサーバに接続します。 接続後は文字列を受信して終了します。
#!/usr/bin/perl
use IO::Socket;
$sock = new IO::Socket::INET(PeerAddr=>'localhost',
PeerPort=>12345,
Proto=>'tcp');
die "IO::Socket : $!" unless $sock;
print <$sock>;
close($sock);
クライアント側はサーバ側よりも単純になります。 ここで重要なのは、PeerAddrとPeerPortです。 Peerというのは「通信相手」を表しています。 PeerAddrというのは、接続相手のIPアドレスもしくはホスト名(FQDN、エイリアスなど)です。 PeerPortというのは接続相手のサーバが待ち受けているポート番号を表します。 ProtoがTCPの場合にはPeerPortはTCPのポート番号を表し、ProtoがUDPの場合にはUDPのポート番号を表します。