久々の更新ですが、

仕事をさぼっていた訳では

ありません。



Web系エンジニアであれば

必ずおさえて欲しいスキルのひとつに

ソケット通信があります。



ソケットの概念はネット等で

調べて頂くとして

Web系の言語だと

大体サポートされてます。



用途は下記のように様々です。



・ cronやタスクスケジューラからのバッチ処理

・ MTAからパイプされた後、Webサーバにリクエスト送信

・ 異なるサーバ間の自動通信



などなど



で、今回はそのソケット接続のサンプルを。

unix系サーバを扱う事が多いので

Perlで記載してます。




#!/usr/bin/perl


use Socket;


# 標準入力の取得
chomp($input = <STDIN>);


# IPアドレスの設定
$addr = inet_aton("192.168.1.10");


# 接続先のプログラム・パラメタ指定
$url = "/register.php";
$enval = urlEncode($input);
$prm = "?input=$enval&action=1";


# ソケットの生成
socket(SOCKET, PF_INET, SOCK_STREAM, 0);


# ポート番号の取得
$port = getservbyname('http', 'tcp');

# IP アドレスとポート番号を、構造体に変換
$sock_addr = pack_sockaddr_in($port, $addr);


# サーバに接続
connect(SOCKET, $sock_addr)
or die "192.168.1.10のポート$portに接続できません。\n";


# ファイルハンドル SOCKET をバッファリングしない
select(SOCKET); $| = 1; select(STDOUT);


# WWWサーバにHTTPリクエストを送る
print SOCKET "GET $url$prm HTTP/1.0\r\n\r\n";

close(SOCKET);


sub urlEncode{
# URLエンコードする

my $value = shift;
$value =~s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
$value =~s/\s/+/g;
return $value;
}


サンプルは標準入力を

リクエストパラメタとして

特定のWebサーバに

HTTPでリクエストを送信しています。