C言語プログラマの為のCGI

戻る

    目 次

  1. CGIでどんな事ができるのでしょうか

  2. CGIの基本

  3. CGIでデータを受け取るには?

  4. CGIの設置について


  1. CGIでどんな事ができるのでしょうか
  2. ところで、CGIを使うと、どんな事ができるのでしょうか。
    何だか色々な事ができそうですが、実はシンプルで、


    の3つです。

    それと、CGIは『1度の実行で1度の出力しかできない』決まりがあります。

    出力は『標準出力』へ、入力は『標準入力』へ行います。簡単ですね。

  3. CGIの基本
  4. 簡単に説明します。細々した説明は他所で勉強してください。

    と言いますか実に簡単で、CGIはWEBサーバに『これから何形式のファイルを出力するのか』を宣言(出力)し、次にユーザーに見せたいデータを出力すれば終わりです。

    以下に、テキストで”こんにちは”と表示させるCGIをC言語で記述した例を紹介します。
    #include <stdio.h>
    
    main()
    {
    	/* テキスト(HTML)を出力する事を宣言 */
    	printf("Content-type: text/html\n\n");
    
    	/* HTML出力開始 */
    	printf("<HTML><BODY>");
    	printf("こんにちは");
    	printf("</BODY></HTML>");
    	printf("\n");
    	/* HTML出力終了 */
    
    }
    ちょろいですね。
    最初のprintf文でテキスト(HTML)を出力する事を宣言しその後にHTMLフォーマットに従った内容を出力すればOKです。

    簡単ですね。C言語を使える方なら誰でもCGIを作る事ができます。

    また、画像を出力させたい場合は以下のようにします。
    #include <stdio.h>
    
    main()
    {
    	/* 画像(GIF)を出力する事を宣言 */
    	printf("Content-type: image/gif\n";
    	printf("Content-length: ファイルサイズ\n\n");
    
    	/* catはDOSで言うところのtypeです */
    	system("cat ./hogehoge.gif");
    	/* 画像出力終了 */
    
    }
    2回目のprintf中”ファイルサイズ”の個所には出力させたいファイルのサイズをテキストで埋め込みます。
    C言語プログラマーなら fseek 〜 ftel 〜 fseek 〜 fopen 〜 fread 〜 fclose なんて言うサンプルを記述しなくても判るだろうと判断し、画像を出力させるCGIに特化した例にしてみました。その方が判りやすいですよね。
    ※ファイルサイズは無理に埋め込まなくても良いようです。もし埋め込まない場合は、1回目のprintfの\nを\n\nに変更し2回目のprintfを削除すればOK。

  5. CGIでデータを受け取るには?
  6. 説明するより前に見てください。
    ↓の入力フォームで入力した文字列を入力し、送信ボタンをクリックすると、指定のCGIがそれを受け取り、そのまま表示させるものです。実際に文字列を入力し、送信ボタンをクリックして、どのように受け取っているのか確かめてみてください。
    HTMLはこんなソースです↓
    <HTML>
    <BODY>
    
    <FORM METHOD="POST" ACTION="./name.cgi">
    <INPUT TYPE="TEXT" NAME="Name" value="HogeHoge">
    <INPUT TYPR="TEXT" NAME="ADDRESS" value="BarBar">
    <INPUT TYPE="submit" VALUE="送信">
    
    </BODY>
    </HTML>

    Cはこんなソースです↓
    #include <stdio.h>
    
    main()
    {
            int     chr;
            int     flag;
    
    
            printf("Content-type: text/html\n\n");
            printf("<HTML><BODY>\n");
            printf("name.cgi<BR>\n");
    
            flag = 0;
            while( flag == 0 )
            {
                    /* 渡されたデータを標準入力より取得する */
                    chr = getchar();
                    /* 渡されたデータをそのまま表示する */
                    putchar(chr);
                    /* データ終了のチェック */
                    if( (chr == EOF) || (chr == 0x00) || (chr == '\n') )
                    {
                            flag = 1;
                    }
            }
    
            printf("</BODY></HTML>\n");
    
    }
    サンプルのCGIは受け取ったデータをそのまま表示させるものですが、HTMLソースとCGIの実行結果を眺めてみると、受け取り側でどう処理すべきなのか判ると思います。
    (下手に専門用語を並べた説明を読むより実行結果を眺めた方が良い場合ってありますよね)

    それと、CGIにデータを渡す方法は多岐に渡りますので、他の方法についてはこなれた頃に調べてみてください。

    参考までに、ANK以外のデータ(例えば全角の文字)は、『%アスキーコード』という形式で渡されます(%83とか%E2とか)。perlの場合は『$val =~ s/%(..)/pack("C", hex($1))/eg;』の1行で済んでしまいますが、C言語だとこういうの弱いですよね。

  7. CGIの設置について
  8. 実際にCGIをいくつか作ってみて、感じた事を残しておきます。


戻る

(raelian@din.or.jp)