httpアクセス

ソケット通信の練習としてhttpアクセスをやってみる。

3.8.9 getline を使ってコプロセスから入力する
gawkはコプロセス(coprocess)を起動して 双方向の通信を可能にすることができる。 これは`|&'演算子を使って行う。 典型的には、以下の例のように データをコプロセスに書き込んでから結果を読み取る:
print "some query" |& "db_server"
"db_server" |& getline

http://www.kt.rim.or.jp/~kbk/gawk-3.1/gawk.html#SEC64

4.7.3 スペシャルファイル for Network Communications
gawkのバージョン 3.1から、awkプログラムで 双方向のTCP/IPコネクションをオープンすることが可能となり クライアントやサーバーとして振舞うことができるようになった。 これは以下の形式の特殊なファイル名を使って行う:
`/inet/プロトコル/ローカルポート/リモートホスト/リモートポート'

http://www.kt.rim.or.jp/~kbk/gawk-3.1/gawk.html#SEC84

というわけで以下のコードで、googleのページ(とヘッダ)がとってこれる。
ファイルパスの形式でソケットのパラメータを与えるのが面白い。

BEGIN{
  host="www.google.com"
  http="/inet/tcp/0/"host"/80"
  print "GET / HTTP/1.0\nHost: "host"\n" |& http
  while(http |& getline) print
  close(http)
}

おぼえがき

プロトコルの所は`tcp', `udp', `raw'が指定出来る。
ローカルポートに0を指定するとシステムの自動割り当てになるようだ。
ポート指定はwell-knownなやつなら25や80のかわりにsmtpやhttpのような指定も出来る。