# The AWK~plus Language Specification

AWK~plus

## Internetworking とは

AWK~plus の入力ファイルは、 URL 指定による 一般ファイルと同じインターフェイスでの読み込みが可能。 さらに、ソケット通信機能を利用することにより、TCP/IP, UDP での双方向通信が可能になりました。 ファイル名: "inet://PROTOCOL/LOCAL-PORT/REMOTE-HOST/REMOTE-PORT [ /接続タイムアウト ] [ /#文字コードセット ]" PROTOCOL: 通信プロトコルを指定する (tcp または udp) LOCAL-PORT このコンピュータのローカルポートを使用して通信する (TCP/IP ならサーバとして動作) REMOTE-HOST 接続先の IP アドレス または ホスト名 REMOTE-PORT 接続先のポート番号 接続タイムアウト (オプション) 接続タイムアウトを、秒単位で指定する (0の場合は、無限) #文字コードセット (オプション) 文字コードセットを指定する 双方向パイプ: |& print[f] |& ファイル名 ファイル名 |& getline の形式で使用する。 |

## daytime

daytime は人が読める形式で時間を出力するサービスで、現在の時刻をテキスト形式で返す。

### 公開NTPサーバにアクセス

make daytime
$(PLUS) Daytime.awk /inet/tcp/0/time.xmission.com/daytime
# Thu Jun 30 00:03:56 2011
BEGIN {
inet = ARGV[1]
inet |& getline
print "#", $0
close(inet)
}

### UDPディレクティッド・ブロードキャストで送信

UDP通信では複数クライアントでの同時受信が可能。

make udps # UDPサーバ
$(PLUS) DaytimeServer.awk /inet/udp/0/localhost/8813

make udp # UDPクライアント
$(PLUS) Daytime.awk /inet/udp/8813/localhost/0
# Thu Jun 30 15:05:05 JST 2011

BEGIN {
inet = ARGV[1]
while(1) {
if (inet ~ /tcp/) printf "" |& inet # TCP/IP: 空文字を送信しクライアント接続を待つ
print strftime() |& inet
if (inet ~ /tcp/) close(inet) # TCP/IPなら閉じる
system("sleep 10")
}
}

## http (HyperText Transfer Protocol)

Webサーバとクライアント (ブラウザ) 間で、 ウェブページを送受信すプロトコルで、要求メッセージに対して応答メッセージが返される。

### 検索エンジンにアクセス

検索エンジンにアクセスして、検索結果を表示する。

make query
$(PLUS) Query.awk www.google.co.jp /search?q=AWK~plus
BEGIN {
host = ARGV[1]
query = ARGV[2]
inet = "/inet/tcp/0/" host "/80/"
printf "GET %s%s HTTP/1.0\r\n\r\n", host, query |& inet
while (0 < (inet |& getline))
print
close(inet)
}

### 関連リンク

- Gawkinet: TCP/IP Internetworking with gawk - 英文マニュアル

Internetworking

1. daytime
   1. 公開NTPサーバにアクセス
   2. UDPディレクティッド・ブロードキャストで送信
2. http (HyperText Transfer Protocol)
   1. 検索エンジンにアクセス