/inet/tcp を使った通信例。クライアントサーバー編(Gawk専用) - AWK
TCPサーバーとTCPクライアントの例です。といっても、TCPサーバー側は、1度受信すると終了します。
**** TCP通信するプログラムの例
o TCPクライアントは、名前を送信します。
o TCPサーバーは、時刻を返します。
o 名前が miku さんの時、TCPサーバーは挨拶します。
** AWK プログラム
o 送信したい時は print もしくは printf を使います。
o 受信したい時は getline を使います。
o tcpserver.awk = TCPサーバー = 通信を待ち受けます。
--------
BEGIN {
port = "/inet/tcp/39393/0/0";
port |& getline;
fflush(port);
print strftime("%Y-%m-%d %H:%M:%S") |& port;
if ($1 == "miku") {
print "Hello" |& port;
print "こんにちは、ミクさん。" |& port;
}
close(port);
}
--------
o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。
o Cygwin 3.1.8は、fflushが無くても正しく動きます。
o tcpclient.awk = TCPクライアント
--------
BEGIN {
port = "/inet/tcp/0/localhost/39393";
print "miku" |& port;
fflush(port);
while ((port |& getline) > 0) {
print $0;
}
close(port);
}
--------
o こちらの場合は、fflushは無くても正しく動きます。
o プログラムの中に出てきた関数の意味は
+ 「getline = ファイル(やパイプ)から1行読み込む」
+ 「print = ファイルなどに書き出す」
+ 「fflush = 出力バッファーを空にする」
+ 「close = 開いたファイル(やパイプ)を閉じる」
** 実行コマンド
o サーバー側
--------
gawk -v BINMODE=3 -f tcpserver.awk
--------
o クライアント側
--------
gawk -v BINMODE=3 -f tcpclient.awk
--------
+ BINMODE の意味は、「BINMODE = バイナリモードで読み書きする」
** 実行手順
o 2つ画面を開いて、片方でサーバープログラム、もう片方でクライアントプログラムを実行します。
+ 何度も実行する時は、コマンドをバッチファイルやシェルにすると便利です。
o Gawk on Windows 3.1.7 を使う時の注意点
+ 1つのパソコンで通信するプログラムを同時に複数動かすと、エラーメッセージが出ます。
+ 通信自体は出来るみたいですが、その後にエラーメッセージが出ます。
+ 通信する相手が存在しないと、すぐにエラーを返します。
+ 相手側を先に動かします。
o Cygwin 3.1.8 で両方のプログラムを動かす時の注意点
+ Cygwinで使っている文字コードの初期値は UTF-8でした。
+ プログラムをテキストエディタで書いて保存する時は、文字コードを UTF-8のBOM無しにすると、画面表示時に漢字などが文字化けしません。
+ 1つの画面で動かしたい時は、サーバー側をバックグラウンドで動かします。
+ コマンドの最後に & を付けるだけです。
--------
gawk -v BINMODE=3 -f tcpserver.awk &
--------
o CygwinとGawk on Windows間で通信する時の注意点
+ 英数字だけで通信する事は、簡単に出来ます。
+ 漢字などの全角文字を送受信した結果を画面表示すると、おそらく文字化けします。
+ これは、送信する方の文字コードと、画面の文字コードが異なる事が原因です。
+ 設定変更をしていなければ、Cygwin 画面で使う文字コードは、UTF-8
+ Windows XPのコマンドプロンプト画面の文字コードは、Shift-JIS です。
+ Cygwinの場合、ファイルの改行コードがUNIX形式(=\r無し)です。
+ 改行コードを Windowsに合わせたい時は、送信側で使う改行コードを変更します。
+ print文しか使っていない場合は、ORS = "\r\n"; で変更出来ます。
+ ORSの詳しい説明は、「ORS = printを使って書き出す時の改行文字」
==
関連ページ:
▼AWKのインターネット接続機能(Gawk専用)
▼AWKプログラムを書く(▼ABC順)
▼AWK
▼制作メモ
> ▼AWKの国際化対応機能 i18n(Gawk専用)
(2010年10月19日変更。Gawk on Windowsは print から getline に切り替える前に fflushが必要)