続 HTTP サーバの CGI 機能を極める [ColdFire V2]
ともぞうさんの記事「ColdFireマイコン温度計にLED(2)」で再確認したのですが、 http サーバの CGI 機能は、 SilentC のプログラムが走っていると機能しないようです。 でも、機能していないわけじゃないらしいんだな。
SilentC のプログラムが走っている場合の実験
以下の実験は、シリアル・インターフェースで接続してお試しください。 telnet では、同じ結果が得られません。
まずは、普通に SilentC のプログラムを実行してから、加速度センサ表示ページを呼び出します。 実行したプログラムは、これです。
main(){#stop 0;while(Getc(0)!='q')SystemSleep();}
すると、みごとにブラウザが停止して、ページが表示されません。 ここで、コンソールから、 'q' をタイプすると、プログラムの実行が停止し、ブラウザには、文字が表示されます。
この実験から、 SilentC のプログラムが実行されている事が原因となって CGI 機能が動作しないらしいことがわかります。
文字表示プログラムが走っている場合の実験
最初の実験は、何もしないプログラムを使いました。 今度は、メッセージを表示するプログラムを使ってみます。
main(){#stop 0;while(Getc(0)!='q'){PrStr("HELLO WORLD\r\n";Sleep(100);}}
一秒ごとに有名なメッセージを表示するプログラムです。 このプログラムを走らせて、加速度センサ表示ページを呼び出すと、やはりブラウザにページが表示されません。 さらに、コンソールの文字も出てこなくなりました。
ここで、コンソールから、 '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 文書に応答を埋め込みます。
このプログラムを実行している状態で、加速度センサ表示ページを呼び出すとCGIが受け取ったリクエストの先頭に "HELLO " が付加された文字列が表示されます。 この例では、あまり意味のある処理は行われていません。 通常の CGI 機能と異なっているのは、 SilentC のプログラムが実行されている状態なので、内部状態を保持しているということです。 何か、怪しいことが出来るかも。
参考文献
Interface (インターフェース) 2008年 12月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/10/25
- メディア: 雑誌
Interface (インターフェース) 2008年 09月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/07/25
- メディア: 雑誌
コメント 0