SSTP サーバー実装前の準備(2001/02/18)
新着情報 トップメニュー ボードメニュー 掲示板 お手紙はここ!

と、言っても単に SSTP サーバーがうまく動作するかどうかを調べるツールを作っただけ。って言うか、前回アップしてたやつの汎用発展型と言うか。ベースになったソースコードは同じです。

いつも SSTP クライアントを実装する時は、1本のソースコードをアプリ毎に書きなおしてたりしまて、実際それで十分だったのですが、今回はコンポーネントとして実装。って言うか Delphi 用のコンポーネントは在るんですけどね。それこそ、他人のものを使うほどのコーディングじゃありませんので。

実装済みの SSTP 規格としては、SEND の 1.1〜1.3 と、EXECUTE の 1.0 だけです。SSTP サーバーが作られる過程では、当然 COMMUNICATEGIVE と言ったリクエストを追加する事になりますが、現段階ではテストアプリ用なのでそれ以外にあっても仕様がないので、割愛です。

……ホントは SEND だって 1.1 だけで十分なんですけどねぃ。ついでだったからオーバーロード関数を定義した、と言う。



既存のコンポーネントは大体、TClientSocket から直接に派生している様なのですが、長山版のはこれをラッピングする事で、余計な情報を隠蔽してあります。公開されているプロパティで TClientSocket と関係があるのは TargetHostTClientSocket.Host にリンクしている事ぐらいですか……TClientSocket.Address は特に意識しなくても、Host プロパティ'127.0.0.1' といった値を入れても動作するみたいです。

それと TClientSocket のイベント OnError OnRead OnWrite はデフォルトの動作を上書きできるようになっていた方がよさげなので、その様なイベントハンドラも実装しています。

と、いう事は、現状たったの6つだけ!



暫定的に TSstpClient と名づけました。競合しにくくて良い名前があったら付けかえると思います(^^;) まぁいいか。

TSstpClient では、リクエストを送った後サーバーからの応答を設定秒だけ待ちます。待っている間は Application.ProcessMessages を呼んでいるのでストールしたりはしませんが、この間にリクエストを発行すると再入となって動作が保証されません。まぁ、SSTP サーバーの方でポートが塞がっているわけですから、大概は大丈夫だと思いますけど。

具体的なコーディングはこんな感じです。


function TSstpClient.DoSendPacket: Boolean;
var
    CLK: TTime;
    TMC: TTime; // TimeOutSec
begin
    TMC := EncodeTime( 0, 0, 3, 0 ); // 待ち時間設定
    CLK := NOW;
    FSocketResult := '';
    FClientSocket.Open;
    FClientSocket.Close;

    repeat
        Application.ProcessMessages;
        Result := (FSocketResult <> '');
    until Result or ((NOW - CLK) >= TMC );
end;

FClientSocket.Open で呼び出される FClientSocket.OnWrite でリクエストを投げ、FClientSocket.OnReadFSocketResult を更新します。
ですから OnWrite 中で FSocketResult を初期化してもいいのですが、返り値を常に必要とするわけでもないのでこうしました。返り値の正統性や、サーバーエラーなどへの処理は、アプリケーション開発者に任せています(^^;)

リクエストは TStringList を使ってこんな感じになってます。


function TSstpClient.Send(Script: String; Options:TSstpSendOptions): Boolean;
begin
    FPacketBuffer.Clear;
    FPacketBuffer.Append( 'SEND SSTP/1.1' );
    FPacketBuffer.Append( 'Sender: '+ SenderName );
    FPacketBuffer.Append( 'Script: '+ Script +'\e' );
    FPacketBuffer.Append( GetSstpSendOptions( Options ) );
    FPacketBuffer.Append( '' );

    Result := DoSendRequest;
end;



で、今回アップロードしておくのは、こんな調子で実装されたコンポーネントを使ったサンプルアプリケーションで、エントリを用いない一行だけのスクリプトのテストになら、結構実用的に使えるのではないかと思います。

ついでに、このサイトの各所で使われている、SSTPサーバーにメッセージを送信する「任意更新」という CGI のテストにも使ってます。
っていっても、エディタじゃないんで表示テスト専用っつーことで。


ダウンロードする(chkskr10.lzh/199KB)


新着情報 トップメニュー ボードメニュー 掲示板 お手紙はここ!