はじめてのネットワークプログラミング
あんまし気乗りしないんだけどね、苦手分野だから。
でも、弱点を克服できるなら悪くないかなーってことでやってみます。
クライアントサイド(client.pl)
use v5.14; use strict; use warnings; use IO::Socket; use constant PORT_COOL => 40000; use constant PORT_HOT => 50000; my $c1 = IO::Socket::INET->new( PeerAddr => 'localhost', PeerPort => PORT_COOL, Proto => 'tcp' ) or die $!; my $c2 = IO::Socket::INET->new( PeerAddr => 'localhost', PeerPort => PORT_HOT, Proto => 'tcp' ) or die $!; $c1->print( "hello\n" ); say $c1->getline(); $c2->print( "hello\n" ); say $c2->getline(); $c1->close; $c2->close;
サーバーサイド(server.pl)
use v5.14; use strict; use warnings; use IO::Socket; use constant PORT_COOL => 40000; use constant PORT_HOT => 50000; my $srv_cool = IO::Socket::INET->new( LocalAddr => "localhost", LocalPort => PORT_COOL, Proto => "tcp", Listen => 1, ReuseAddr => 1, Blocking => 0 ) or die $!; my $srv_hot = IO::Socket::INET->new( LocalAddr => "localhost", LocalPort => PORT_HOT, Proto => "tcp", Listen => 1, ReuseAddr => 1, Blocking => 0 ) or die $!; $srv_cool->listen or die $!; $srv_hot->listen or die $!; # エントリー待ち my ( $cl_cool, $cl_hot ); while ( not ($cl_cool && $cl_hot) ) { if ( not $cl_cool ) { $cl_cool = $srv_cool->accept(); if ( $cl_cool ) { say 'accept COOL!'; next; } } if ( not $cl_hot ) { $cl_hot = $srv_hot->accept(); if ( $cl_hot ) { say 'accept HOT!'; next; } } sleep( 1 ); say 'zzz...'; } foreach my $c ( $cl_cool, $cl_hot ) { while ( 1 ) { my $q = $c->getline(); next if not $q; say $q; $c->print( "hello\n" ); last; } $c->close(); } $srv_cool->close(); $srv_hot->close();
実行するには、ターミナルを2つ立ち上げて、
サーバーサイドから実行する。
ターミナル(1)
$ perl server.pl
zzz...
zzz...
zzz...
zzz...
accept COOL!
accept HOT!
hello
(改行)
hello
(改行)
ターミナル(2)
$ perl client.pl
hello
(改行)
hello
(改行)
なんで、”COOL”と”HOT”なのかは、
ここにある「ルールブック(確定版).pdf」を読んで頂ければと思う。
CHaser2013 – 全国情報技術教育研究会
http://www.zenjouken.com/?page_id=517
想定する要件はこんな感じ。
2つのクライアントからサーバーに接続すると対戦が始まって、
2つのクライアントに交互にターンが回ってくるというもの。
とりあえず、ポート番号さえ異なれば、
こんな感じで接続を維持できることが分かったので、
次はクライアントサイドに専念しようと思う。
おしまい。
Leave a Comment