SSブログ

続 HTTP サーバの CGI 機能を極める [ColdFire V2]このエントリーを含むはてなブックマーク#

1990557

ともぞうさんの記事「ColdFireマイコン温度計にLED(2)」で再確認したのですが、 http サーバの CGI 機能は、 SilentC のプログラムが走っていると機能しないようです。 でも、機能していないわけじゃないらしいんだな。

SilentC のプログラムが走っている場合の実験

以下の実験は、シリアル・インターフェースで接続してお試しください。 telnet では、同じ結果が得られません。

まずは、普通に SilentC のプログラムを実行してから、加速度センサ表示ページを呼び出します。 実行したプログラムは、これです。

main(){#stop 0;while(Getc(0)!='q')SystemSleep();}
WS000168.png

すると、みごとにブラウザが停止して、ページが表示されません。 ここで、コンソールから、 'q' をタイプすると、プログラムの実行が停止し、ブラウザには、文字が表示されます。

この実験から、 SilentC のプログラムが実行されている事が原因となって CGI 機能が動作しないらしいことがわかります。

文字表示プログラムが走っている場合の実験

最初の実験は、何もしないプログラムを使いました。 今度は、メッセージを表示するプログラムを使ってみます。

main(){#stop 0;while(Getc(0)!='q'){PrStr("HELLO WORLD\r\n";Sleep(100);}}
WS000169.png

一秒ごとに有名なメッセージを表示するプログラムです。 このプログラムを走らせて、加速度センサ表示ページを呼び出すと、やはりブラウザにページが表示されません。 さらに、コンソールの文字も出てこなくなりました。

ここで、コンソールから、 'q' をタイプすると、プログラムの実行が停止します。 ところが、ブラウザには、あのメッセージの断片が表示されます。 ここは、 "ad::adinit" 関数を呼び出している箇所です。 どうも、コンソール出力が埋め込まれているようです。

サーバ・プログラムを作成した

さて、いよいよ、実用的なプログラムを作成します。 最初は、単なる文字列入出力で対応できるのかと思っていたのですが、一筋縄ではいきませんでした。

main(){
  char ch;
  char *msg=MemoryAlloc(81);
  long index;
  #stop 0
  
  for (;;) {
    index=0;
    for(;;) {
      ch=Getc(1);
      if (ch=='\r') break;
      msg[index++]=ch;
      if (ch==0) break;
    }
    if (ch=='\r') break;
    PrStr("HELLO ");
    PrStr(msg);
    PrStr("\r\n");
    Pokeb(0x20007F2E,0);
  }
  MemoryFree(msg);
}

コンソールから入力された文字列の頭に"HELLO "を付けて返答する簡単なサーバ(?)です。

コンソールから入力された文字は、 msg 配列に格納されます。 配列の長さに関するエラー処理はしていませんので、ご注意ください。 入力文字列は、ヌル文字 (0) で終了します。 このため、この処理は Gets 関数で代用することが出来ず、 Getc で一文字ずつ処理しなくてはなりません。

コンソールから "Enter" が入力されたらプログラムは終了します。

応答には、 "PrStr" 関数を使っています。 全ての応答を出し終わったら、 0x20007F2E 番地の CgiFlag に 0 を書き込みます。 すると、 CGI 処理が応答を受け取って、 HTML 文書に応答を埋め込みます。


WS000170.png

このプログラムを実行している状態で、加速度センサ表示ページを呼び出すとCGIが受け取ったリクエストの先頭に "HELLO " が付加された文字列が表示されます。 この例では、あまり意味のある処理は行われていません。 通常の CGI 機能と異なっているのは、 SilentC のプログラムが実行されている状態なので、内部状態を保持しているということです。 何か、怪しいことが出来るかも。

参考文献

Interface (インターフェース) 2008年 12月号 [雑誌]

Interface (インターフェース) 2008年 12月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/10/25
  • メディア: 雑誌
Interface (インターフェース) 2008年 09月号 [雑誌]

Interface (インターフェース) 2008年 09月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/07/25
  • メディア: 雑誌

nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。