2010年10月19日火曜日

/inet/tcp を使った通信例。クライアントサーバー編(Gawk専用) - AWK

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が必要)