複数のコンピュータをネットワークを介してつなぎ,それらにのせられたアプリケーションのあいだで相互に通信させる実験をするとき,実験を起動するのに,最初に通信をおこなうアプリケーションのポートをたたくようにするのが便利である. この目的で内容のない UDP (User Datagram Protocol) メッセージをおくるプログラムを書いてみた (UDP を TCP にかえるのは容易であるが,受信プログラムはやや複雑になる).
なんということはないプログラムだが,用意しておくと (すくなくとも私のばあいは) やくにたつ. 内容がからだと誤動作する可能性があるなら,特定の内容をいれて,それをアプリケーションでチェックするようにすればよい. たたくアドレスやポートをコマンド引数としてあたえられるようにすれば便利かもしれないが,ここではプログラムのなかであたえている. (このほうが,何度もつかうときに,いちいちコマンド引数をあたえる必要がないので私にとっては便利である.)
#!/usr/bin/perl ############################################################################## # # UDP port kicker # ############################################################################## use strict; use Socket; my $IP = '192.168.0.3'; # destination my $REMOTE_PORT = 8000; my $LOCAL_PORT = 8000; socket(SOCK, AF_INET, SOCK_DGRAM, getprotobyname('udp')) || die "socket(SOCK)$!\n"; setsockopt(SOCK, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die "setsockopt()$!\n"; bind(SOCK, pack_sockaddr_in($LOCAL_PORT, INADDR_ANY)) || die "bind(SOCK)$!\n"; send(SOCK, '', 0, pack_sockaddr_in($REMOTE_PORT, inet_aton($IP))); send(SOCK, '', 0, pack_sockaddr_in($REMOTE_PORT, inet_aton($IP))); close(SOCK); 1;
2010-3-7 改訂:
1 行よけいな行があったのと,変数名に不適切なものがあったのなどをなおした.
まえのプログラムはテストしてなかったが,これはテストずみ.