sironekotoroの日記

Perl で楽をしたい

独習Perl 第9章 ネットワーク

9.1 ソケット

  • いままでの章は他のPerl初心者本にも載ってたけど、このソケットつかってのプログラミングは初めて。
  • めっちゃ新鮮
use strict;
use warnings;

# 文字入力をそのまま返すスクリプト(server)

use IO::Socket;

my $server_socket = new IO::Socket::INET(
    LocalPort => '10000',
    Proto     => 'tcp',
    Listen    => 5,
    Reuse     => 1
);
unless ($server_socket) {
    print "Socket Error:$!\n";
};

# 待機
my $client_socket = $server_socket->accept();

# クライアントからの入力を表示
while ( <$client_socket> ) {
    print $_;
}

# ソケットを閉じる
$client_socket->close();
$server_socket->close();

use strict;
use warnings;
use Data::Dumper;

# 文字入力をそのまま返すスクリプト(client)

use IO::Socket;

my $client_socket = new IO::Socket::INET(
    PeerAddr => 'localhost',
    PeerPort => '10000',
    Proto    => 'tcp',
    TimeOut  => 5,
);
unless ($client_socket) {
    print "Socket Error:$!\n";
}

# 入力をサーバーに送信
my $string;
while ( $string = <STDIN> ) {
    if ( $string =~ /^QUIT/ ) {
        last;
    }
    print $client_socket "$string";
}

# ソケットを閉じる
$client_socket->close;

  • ターミナル二つ開いて、clientで入力した文字がそのままserver側で表示されているのに感動する
  • ちなみに、表示したかった文字が全部一律に「string」ってなって表示される事があって、ずっとserver側のスクリプト見てたんだけど、原因はclient側のスクリプト、という事が・・・
    • server側とclient側、二つ見ないといけないのは面倒ですな
use strict;
use warnings;
use Data::Dumper;

use IO::Socket;

# clientから「PING」と入力されると、「PONG」と返すよ

my $server_socket = new IO::Socket::INET(
    LocalPort => 10000,
    Proto     => 'tcp',
    Listen    => 5,
    Reuse     => 1,
);
unless ($server_socket) {
    print "Error :$!\n";
}

my $client_socket = $server_socket->accept();

$| = 1;

while (<$client_socket>) {
    if ( $_ =~ /PING/ ) {
        print "PONG\n";
    }
    else {
        print "$_";
    }
}

$client_socket->close();
$server_socket->close();
use strict;
use warnings;
use Data::Dumper;

use IO::Socket;

# Yahoo.co.jpで使っているサーバーソフトをしらべる

my $url = 'http://www.yahoo.co.jp/index.html';
my $host;
my $file;

if ( $url =~ /http:\/\/([^\/]+)(\/.*)/ ) {

    $host = $1;
    $file = $2;
}
else {
    print "Parse Error\n";
}

my $client_socket = new IO::Socket::INET(
    PeerAddr => $host,
    PeerPort => 'http',
    Proto    => 'tcp',
    TimeOut  => 5,
);
unless ($client_socket) {
    print "Error :$!\n";
}

print "$host $file" . "\n";
print $client_socket "HEAD $file HTTP/1.0\n\n";

while (<$client_socket>) {
#    print $_;
    if ($_ =~ /Server/){
        print $_;
    }
}

$client_socket->close();