• ベストアンサー

C言語でCGI

初めてC言語でCGIをやるわけではないのですが、わからないことがあるので質問させていただきます。 http://www2k.biglobe.ne.jp/~motoi/cdecgi.html このサイトを参考に話を進めさせていただきます。 まず、htmlで <HTML> <HEAD> <TITLE>テストページ</TITLE> </HEAD> <BODY BGCOLOR=#a0d0ff> <FORM METHOD="get" ACTION="test2.cgi"> <INPUT TYPE="text" NAME="fieldname" SIZE="50"><BR> <INPUT TYPE="text" NAME="fieldname2" SIZE="50"><BR> <INPUT TYPE="text" NAME="fieldname3" SIZE="50"><BR> <INPUT TYPE="submit" VALUE="書き込み"> </FORM> </BODY> </HTML> と書き、C言語で #include <stdio.h> #include <stdlib.h> #define getenv1(a) ((pdata=getenv(a)) ? pdata : "(NULL)") main() { int len; printf("Content-type: text/html\n\n"); printf("<HTML><HEAD></HEAD><BODY>\n"); printf("%s<BR>\n",getenv("QUERY_STRING")); printf("</BODY></HTML>\n"); } と書きます。 それからコンパイルを実行し、パーミッションも変更して実行を WEBサーバを作らずに実行するとファイルのダウンロードが始まります。(ファイル名はtest2.cgi) WEBサーバが無ければ文字をCGIに表示することは無理なのでしょうか? 教えてください。お願いします。

noname#77475
noname#77475
  • CGI
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>WEBサーバを作らずに実行するとファイルのダウンロードが始まります。(ファイル名はtest2.cgi) 実行というのはどうやって? formページの"書き込み"ボタン押下でしょうか? formページはブラウザからローカルのファイルを開いたでしょうか? 上記の通りであれば、test2.cgiがダウンロードされるのは通常の動作です。 Webサーバがなければ実行された結果は戻りません。

noname#77475
質問者

お礼

実行というのはおっしゃるとおり、formページの書き込みボタンを押したときのことをいいます。 Webサーバがなければ動作しないのですね。 よくわかりました。 ありがとうございます。

その他の回答 (1)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

CGI自体がWebサーバとその他のプログラムをつなぐインターフェースなのでWebサーバがなければ成り立ちませんね。

関連するQ&A

  • CGIで送受信するプログラムの作り方

    入力フォームを返すのとフォームからのPOSTとGETを受け取って処理する、 同一のスクリプトを、CGI、C言語で作成致しましたが、 上手く動作していません。(白紙のページが表示されるだけでした。) getenv("REQUEST_METHOD");がNULLだった場合に本来表示されるハズのページが表示されるはずで、これが出ないという事は、getenv("REQUEST_METHOD");がNULLでなく、うまく動作していないのでは? こう考え、getenv("REQUEST_METHOD");の中身を表示させた所、GET と表示されました。 何も送信していないのに、GETと判断されているのは何故でしょうか? また、正しい動作をするプログラムをご提示頂けますと助かります。 /* form2.c */ #include <stdio.h> #include <stdlib.h> int main(void) { int len; char *clen; char *data,*method,*qs; printf("Content-type: text/html\n\n"); printf("<html><head></head><body>\n"); method = getenv("REQUEST_METHOD"); printf("%s\n", method); if(method == NULL){ printf("Content-type: text/html\n\n"); printf("<html>\n"); printf("<head>\n"); printf("<title>form test page</title>\n"); printf("</head>\n"); printf("<body>\n"); printf("<form method=\"post\" action=\"form2.cgi\">\n"); printf("<input type=\"text\" name=\"fieldname\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname2\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname3\" size=\"50\"><br>\n"); printf("<input type=\"submit\" value=\"書き込み\">\n"); printf("</form>\n"); printf("<form method=\"get\" action=\"form2.cgi\">\n"); printf("<input type=\"text\" name=\"fieldname\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname2\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname3\" size=\"50\"><br>\n"); printf("<input type=\"submit\" value=\"書き込み\">\n"); printf("</form>\n"); printf("</body>\n"); printf("</html>\n"); exit(0); } //POST else if(!strcmp(method, "POST")){ clen = getenv("CONTENT_LENGTH"); if(clen == NULL){ exit(0); } len = atol(clen); data = malloc(len+1); scanf("%s",data); data[len] = '\0'; printf("Content-type: text/html\n\n"); printf("<html><head></head><body>\n"); printf("%s<br>\n", data); printf("</body></html>\n"); } //GET else if(!strcmp(method, "GET")){ qs = getenv("QUERY_STRING"); printf("Content-type: text/html\n\n"); printf("<html><head></head><body>\n"); printf("%s<br>\n", qs); printf("</body></html>\n"); } printf("</body></html>\n"); } 宜しくお願いいたします。

    • ベストアンサー
    • CGI
  • CGIでPOSTで送受信するプログラムの作り方

    こんにちは、C言語でCGIを作成していて疑問に思ったのですが、 POSTメソッドで送られてきたデータを解析する際には、POSTで送信するプログラムと、 POSTを受信するプログラムとに必ず分けてある様に感じられました。 これらを1つにまとめて送受信する事は出来ないのでしょうか? 例えば、以下の様なプログラムを組んだとします。 /* form.c */ #include <stdio.h> int main(void) { printf("Content-type: text/html\n\n"); printf("<html>\n"); printf("<head>\n"); printf("<title>form test page</title>\n"); printf("</head>\n"); printf("<body>\n"); printf("<form method=\"post\" action=\"form2.cgi\">\n"); printf("<input type=\"text\" name=\"fieldname\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname2\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname3\" size=\"50\"><br>\n"); printf("<input type=\"submit\" value=\"書き込み\">\n"); printf("</form>\n"); printf("</body>\n"); printf("</html>\n"); } /*以下、受信プログラム*/ /* form2.c */ #include <stdio.h> #include <stdlib.h> int main(void) { int len; char *clen; char *data; clen = getenv("CONTENT_LENGTH"); if(clen == NULL){ printf("no contents.\n"); exit(1); } len = atol(clen); data = malloc(len+1); scanf("%s",data); data[len] = '\0'; printf("Content-type: text/html\n\n"); printf("<html><head></head><body>\n"); printf("%s<br>\n", data); printf("</body></html>\n"); } 上記2つのプログラムを1つに統合して、 送受信を1つのプログラムで行うという事は出来ないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • CGI
  • C言語CGIについての質問

    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"); 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> ただ送信するだけでなく受け取り手の人がゴミ箱と受信ボックスとで選択できるようにしたいです またその日の日日も表示できるようにしたいです どなたかご教授ください

  • 1つのhtmlページにたくさんのCGIを表示したい

    1つのhtmlページにたくさんのCGIを表示したいのですができますか? "Content-type: text1/html\n\n" /* ** CGI版のhello.c(HTML仕様) */ #include <stdio.h> main(){ printf("Content-type:1/html\n\n"); /* ここから HTML でお馴染みのタグ */ <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> /* あいうえお */ "Hello C World!<BR>\n" "</BODY>" "</HTML>" } みたいなCGIを入れたいのですが。

    • 締切済み
    • CGI
  • CGIでフォームからの入力内容を表示されない。

    初歩的な質問ですみません。 自宅サーバを使っています。 ■ActivePerl 5.8.8 Build 822 ■httpd142p ------------------------------ ■httpd142p ┗■cgi-bin  ┣■cgi-lib.pl  ┣■test.cgi  ┗■test.html ------------------------------- CGIは動作します。 一行目のパスもあっています。 --------------------------- 【test.cgi】 #!C:/perl/bin/perl #require './cgi-lib.pl'; #&ReadParse(*MYDATA) print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<TITLE>RESULT</TITLE>\n"; print "<BODY>\n"; print "氏名 = $MYDATA{'simei'}\n\n"; print "住所 = $MYDATA{'jyusyo'}\n"; print "</BODY>\n"; print "</HTML>\n"; exit; -------------------------------- 【test.html】 <HTML> <HEAD> <TITLE>TEST</TITLE> </HEAD> <BODY> <P> <FORM ACTION="test.cgi" METHOD="POST"> 氏名:<INPUT TYPE="text" NAME="simei"> 住所:<INPUT TYPE="text" NAME="jyusyo"> <INPUT TYPE="submit" VALUE="送信"> <INPUT TYPE="reset" VALUE="リセット"> </P> </FORM> </BODY> </HTML> ---------------------------------- ■実行結果 氏名 = 住所 = ---------------------------------- どなたかご教授ください。

    • ベストアンサー
    • CGI
  • Perl CGI -入力フォーム-

    Perlを始めたばかりの初心者です。 Perlの中にフォームを入れたいのですが、エラーが出てしまいます。 現在は、ローカルで作動させています。 #! c:/perl/bin/perl print "Content-type: text/html\n\n"; print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n"; print "<head><title>TEST</title></head>\n"; print "<body>\n"; print "<p><input type="text" name="name"></p>\n"; print "</body>\n"; print "</html>"; 【print "<p><input type="text" name="name"></p>\n";】この記述がエラーの対象行となっています。 inputを使用する場合は他にも記述が必要なのでしょうか? 宜しくお願いします。

  • フォームからCGIを起動できない

    こんばんは。 WebサーバApacheでCGIを作成しています。 DocumentRootが初期設定/var/www/html/で、その下にindex.htmlを作成しました。 次にcgiのディレクトリが初期設定の/var/www/cgi-bin/で、その下にtest.cgiを作成しました。 そして、test.cgiのパーミッションを-rwxr-xr-xにしてからApacheを起動しました。 別マシンのブラウザからhttp://xxx.xxx.xxx.xxx/index.htmlでアクセスし、フォームのテキストボックスに「abc」と入力して送信ボタンを押しましたが、404エラーになってしまいます。 (アドレスバーには「http://xxx.xxx.xxx.xxx/test.cgi?NAME=abc」と表示) ブラウザのアドレスバーに直接「http://xxx.xxx.xxx.xxx/cgi-bin/test.cgi?NAME=abc」とすると正常にアクセスできます。 ドキュメントルート配下にあるindex.htmlからドキュメントルート外にあるCGIのディレクトリ(ScriptAlias /cgi/bin/ "/var/www/cgi-bin/")を参照するにはどのようにしたらよいのでしょうか? ----------index.html---------------- <HTML> <HEAD><TITLE>フォーム</TITLE></HEAD> <BODY> <FORM ACTION="../cgi-bin/test.cgi" METHOD="GET">名前 <INPUT TYPE="TEXT" NAME="NAME"><BR> <INPUT TYPE="SUBMIT" VALUE="送信"> </FORM> </BODY> </HTML> ----------index.html---------------- ----------test.cgi------------------ #!/usr/bin/perl $str = $ENV{"QUERY_STRING"}; print << "EOF"; Content-type: text/html <HTML> <HEAD><TITLE>TESTCGI</TITLE></HEAD> <BODY>$str</BODY> </HTML> EOF ----------test.cgi------------------

    • ベストアンサー
    • CGI
  • CGI初心者です

    sub html でフォームに入力してもらい、 sub kekka で入力情報を確認し、 sub shori でテキストファイルに登録。 というプログラムを考えているのですが、 フォームから入力されたデータが入った変数$in{'name'} が、sub shori に移ると消えてしまいます。 いろいろ試行錯誤したのですが分かりませんでしたので 教えていただけたらと思います。 以下がサンプルのソースです。 #!/perl/bin/perl require './jcode.pl'; require './cgi-lib.pl'; &ReadParse; if($in{'action'} eq "set"){&kekka;} elsif($in{'action'} eq "sss"){&shori;} else{&html;} sub html{ print "Content-Type: text/html\n\n"; print <<EOM <html>\n <body>\n <h1>CGIテスト1</h1>\n <form ACTION="./sample.cgi" METHOD="POST">\n <INPUT type=hidden name=action value="set">\n 名前<br><input type=text name="name" size="30" MAXLENGTH="30"><br>\n <input TYPE="submit" value="確認"><INPUT type="reset" value="リセット">\n </form>\n </body>\n </html>\n EOM } sub kekka{ print "Content-Type: text/html\n\n"; print <<EOM <html>\n <body>\n <h1>CGIテスト2</h1>\n <form ACTION="./sample.cgi" METHOD="POST">\n <INPUT type=hidden name=action value="sss">\n name = $in{'name'} <input TYPE="submit" value="登録">\n </form>\n </body>\n </html>\n EOM } sub shori{ print "Content-Type: text/html\n\n"; print <<EOM <html>\n <body>\n <h1>CGIテスト3</h1>\n <form ACTION="./sample.cgi" METHOD="POST">\n name = $in{'name'} </form>\n </body>\n </html>\n EOM }

    • ベストアンサー
    • Perl
  • FORMを教えてください

    全くの素人で、どなたか教えて下さい。 <HTML> <TITLE>TEST</TITLE> <BODY> <FORM ACTION="test.cgi" METHOD="POST"> 氏名<INPUT TYPE="TEXT" NAME="name"> 住所<INPUT TYPE="TEXT" NAME="tokoro"> <INPUT TYPE="Submit" value="データ送信"> <INPUT TYPE="Reset" value="リセット"> </FORM> </BODY> </HTML> 名前と住所を記入して送信ボタンを押したら記入した内容が表示されるCGIプログラムを教えて下さい。 #!/usr/local/bin/perl print "Content-Type: text/html"; print "<html>\n"; print "<head><title>TEST</title></head>\n"; print "<body>\n"; #受け取ったデータを表示する print "氏名=$in{'namae'}\n"; print "住所=$in{'tokoro'}\n"; print "</body>\n"; print "</html>\n"; exit; とした場合 氏名= 住所= しか表示されません。 何が足りないのでしょうか?

    • 締切済み
    • CGI
  • CGIだとうまくいかない!

    まずは下記ソースをご覧ください。 これを実行させると上下2のフレームができまして、上フレームにある「Jump C」と いうリンクをクリックすると、下フレームが「ccccccccc」というところまでジャンプ するように作りました。 まずは実験版としてCGIでなくPC上でHTMLファイルを作成(main.cgiがmain.htmになる) しました。その時はうまく下フレームの「cccccccc」までジャンプしたのですが、これを CGIに作り直して実行させたところ、何も動作しないままでした。 CGIでもHTML上同様の動きをさせるにはどのようにしたらよろしいでしょうか? どなたかご存知の方いましたら、ご鞭撻のほどお願い致します。 -------------- main.cgi ------------------------------------- <HTML> <HEAD><TITLE>フレームテスト</TITLE></HEAD> <FRAMESET ROWS="20%,*"> <FRAME SRC="top.cgi" NAME="FRAME2"> <FRAME SRC="btm.cgi" NAME="FRAME3"> </FRAMESET> </HTML> -------------- top.cgi ------------------------------------- <HTML> <head> </head> <body> <a href="right_btm.cgi#c" target="FRAME3">Jump C</a> </body> </html> -------------- btm.cgi ------------------------------------- <HTML> <head> </head> <body> <A NAME="#a">aaaaaaaaa<br><br><br><br><br><br><br><br><br> <A NAME="#b">bbbbbbbbb<br><br><br><br><br><br><br><br><br> <A NAME="#c">ccccccccc<br><br><br><br><br><br><br><br><br> <A NAME="#d">ddddddddddd<br><br><br><br><br><br><br><br><br> </body> </html> ------------------------------------------------------------ このCGIを実行すると、