2010年3月4日木曜日

Modula-3でTCP

Modula-3のお勉強。

TCPモジュールを使ってエコーサーバー(受信した内容をそのまま送り返す)を作ってみる。

(* Main.m3 *)
MODULE Main;
IMPORT TCP,IP,ConnRW;
IMPORT Rd,Wr, IO, Text;

VAR con :TCP.Connector;
VAR server :TCP.T;
VAR endpoint :IP.Endpoint;
VAR addr :IP.Address;
VAR rd: Rd.T;
VAR wr: Wr.T;


BEGIN
EVAL IP.GetHostByName("localhost",addr);
endpoint := IP.Endpoint{addr,9999};
con := TCP.NewConnector(endpoint);
IO.Put(IP.GetCanonicalByAddr(IP.GetHostAddr()));
IO.Put("Addr:");
IO.PutInt(endpoint.addr.a[0]);
IO.Put(".");
IO.PutInt(endpoint.addr.a[1]);
IO.Put(".");
IO.PutInt(endpoint.addr.a[2]);
IO.Put(".");
IO.PutInt(endpoint.addr.a[3]);
IO.Put("\nPort:");
IO.PutInt(endpoint.port);
IO.Put("\n");
LOOP
server := TCP.Accept(con);

rd := ConnRW.NewRd(server);
wr := ConnRW.NewWr(server);

LOOP
WITH com = IO.GetLine(rd) DO
IF Text.Equal(com,"quit") THEN
EXIT;
END;
IO.Put(com & "\n", wr);
IO.Put(com);
IO.Put("\n");
END;
END;
Rd.Close(rd);
Wr.Close(wr);
TCP.Close(server);
END;
END Main.
(* m3makefile *)
import("libm3")
import("tcp")
implementation("Main")
program("echoserv")

例外処理を書いてないあたり問題かもしれないが、とりあえず動くと思われる。ぶっちゃけ、処理系のexamplesにあるHTTPDの劣化版です。

IP.GetHostAddr()の返り値が、どうも127.0.1.1になってるっぽいのでIP.GetHostByName()を使った。

以下、今回のModula-3プログラムについてのメモ

  • 手続きは返り値を返すものと返さないものの2種類
    • 返り値を返す手続き(function procedure)の返り値が不要な場合、EVALを使う
  • 手続きの引数には3種類のモードがある
    • VALUEがデフォルトの動作で、値渡し
    • VARは参照渡し
    • READONLYは参照渡しだが、値を変更しない。巨大なデータ構造などを引数とする場合に利用する。
    • 参照渡し、といってもREF型を引数に渡すわけではなさそう。
  • WITHはDOからENDまでのスコープから見える変数を導入する
  • LOOPは無限ループ。EXITで抜け出す

0 件のコメント:

コメントを投稿