cで書いたプログラムをCGIで動かしたい
-
blade
cで書いたプログラムをCGIで動かしたい
cgi初心者です。
cで書いたプログラムをCGIで動かしたいのですが、ブラウザでローカルホストに接続してファイルにアクセスしようとしても
データを受信していません
と表示され、正しく動作しません。
私が作ったものではない同じフォルダにあるcgiファイルはちゃんと動くのですが、
私のは動きません。
Visual Studio 2010で.exeファイルを生成して、その名前を変えて拡張子を.cgiにし指定のフォルダに置いたのですが
ダメでした。ソースの.cファイルも拡張子cgiにしたのですがダメでした。
ソースをコンパイルして出力ファイル名を***.cgiにするなどの工程を踏まないといけないのでしょうか。
または他に何か必要な要素があるのでしょうか。
cで書いたプログラムをCGIで動かしたいのですが、ブラウザでローカルホストに接続してファイルにアクセスしようとしても
データを受信していません
と表示され、正しく動作しません。
私が作ったものではない同じフォルダにあるcgiファイルはちゃんと動くのですが、
私のは動きません。
Visual Studio 2010で.exeファイルを生成して、その名前を変えて拡張子を.cgiにし指定のフォルダに置いたのですが
ダメでした。ソースの.cファイルも拡張子cgiにしたのですがダメでした。
ソースをコンパイルして出力ファイル名を***.cgiにするなどの工程を踏まないといけないのでしょうか。
または他に何か必要な要素があるのでしょうか。
Re: cで書いたプログラムをCGIで動かしたい
.cは単なるソースファイルなので、.cgiに変えても動かないと思いますよ。
.cをコンパイルして.exeにして配置する、というのは方向性はOKです。
作ったプログラムに問題があるのかその他に問題があるのか(例えば配置方法)は現時点では分かりません。
取り敢えずそのプログラムのソースコードを貼り付けて皆で見ませんか?
.cをコンパイルして.exeにして配置する、というのは方向性はOKです。
作ったプログラムに問題があるのかその他に問題があるのか(例えば配置方法)は現時点では分かりません。
取り敢えずそのプログラムのソースコードを貼り付けて皆で見ませんか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: cで書いたプログラムをCGIで動かしたい
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
blade
Re: cで書いたプログラムをCGIで動かしたい
httpdでcgiサーバを設定して、テストとしてこのtest.cgiは動くことを確認しました。
私の書いたソースなのですが、主に処理内容スペースとcgi出力スペースにわかれているのですが、
処理内容スペースは個人的な情報が多く書いてあったりでここに貼るのはひかえさせてもらってもよろしいでしょうか。
コマンドライン上では正しく動きましたのでそこでエラーはないと思います。
print "Content-type: text/html\n";
print "\n";
print "<html>\n";
print "<head>\n";
print "<title>CGIのテスト</title>\n";
print "</head>\n";
print "<body>\n";
print "<p>CGIのテスト</p>\n";
print "</body>\n";
print "</html>\n";処理内容スペースは個人的な情報が多く書いてあったりでここに貼るのはひかえさせてもらってもよろしいでしょうか。
コマンドライン上では正しく動きましたのでそこでエラーはないと思います。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define MAXLEN 3000 //文字列の長さ
//文字列を置換する。 buf の中の mae を ato にする。成功=1 失敗=0
//参考:「C言語:文字列をいじる」
//www.geocities.jp/debu0510/personal/c_moji.html
int strrep(char *buf, char *mae, char *ato);
int main (int argc, char **argv)
{
typedef struct{
char* base; //単語の原型
int id; //単語の・・
char *pos; //単語の品詞
char arg; //単語の引数の・・
}_token;
_token p;
char buf[256];
char input[MAXLEN];
int flag = 0; //同義語があるかどうかのフラグ
FILE *fp_input;
FILE *fp_adj, *fp_v, *fp_adv, *fp_n;//各品詞の同義語ファイル
char st1[MAXLEN];
char st2[MAXLEN];
char word[800][64]; //検出された同義語の格納
char wordtmp[512];
char num[800][8]; //語句に割り当てられた番号を格納
//これを保存する必要がありそう
unsigned int i, j, k;
unsigned int size=100;
int strnum=0; //同義語、語句番号の格納場所
int same[800]; //語句番号が同じもの同士、同じ自然数を格納する
int samenum=1; //自然数ごとに、同義語の語句同士をまとめる
char data[256]; //単語のデータを格納
FILE *fp2; //fp2は入力ファイル
errno_t error;
char* ctx;
char* tp[200][30];
char kara[8];
/************ 処理内容スペース***************/
/************ ***************/
/************ cgi出力スペース ***************/
printf("Content-type:text/html\n\n");
printf("<HTML><HEAD>\n");
printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n");
printf("<TITLE>ツールです</TITLE>\n");
printf("</HEAD>\n<BODY>\n");
printf("<FORM METHOD=\"POST\" ACTION=\"./passive.cgi\">");
//ここからhtml出力内容
printf("<font size = 5>同義語特定結果</font><br>\n");
printf("<hr>\n");
if(flag == 1){ //同義語があれば
printf("<tt>原文を出力します。<br></tt>\n");
printf("<textarea name=string rows=4 cols=50>%s</textarea><br><br>\n", st2);
printf("<input type=hidden name=st1 value=%s>",st1); //入力文章
printf("<input type=hidden name=st2 value=%s>",st2); //指示語のない文章
//printf("<input type=hidden name=nokori value=%s>",nokori); //残りの文章
//結果を出力
// printf ("%s<br>", input);
printf ("<hr><tt>同義語ごとに番号をつけ、表現を統一させました。</tt><br>\n");
printf ("<tt>誤りがあれば、文章を修正してください。</tt><br><br>\n");
printf ("<tt>誤りが無ければ、「次へ」を押してください。</tt><br><br>\n");
}
else{
//printf("<input type=hidden name=st1 value=%s>",st1); //入力文章
//printf("<input type=hidden name=st2 value=%s>",st2); //指示語のない文章
//printf("<input type=hidden name=nokori value=%s>",nokori); //残りの文章
/* printf("<textarea name=string rows=4 cols=50>%s</textarea><br><br>\n", st1);*/
printf ("<hr><tt>この文章中に同義語は無いので、次へを押してください。</tt><br>\n");
}
printf ("<br><br><a href=\"../../dougigohint.html\" target=\"_blank\">この画面のヒント</a></li><br><br>");
printf ("<INPUT TYPE=SUBMIT VALUE=\"次へ\" >");
printf("</FORM></BODY></HTML>\n");
/*********************************************************/
return 0;
}
//文字列を置換する。 buf の中の mae を ato にする。成功=1 失敗=0
//参考:「C言語:文字列をいじる」
int strrep(char *buf, char *mae, char *ato)
{
char *mituke;
size_t maelen, atolen;
maelen = strlen(mae);
atolen = strlen(ato);
if (maelen == 0 || (mituke = strstr(buf, mae)) == NULL) return 0;
memmove(mituke + atolen, mituke + maelen, strlen(buf) - (mituke + maelen - buf ) + 1);
memcpy(mituke, ato, atolen);
return 1;
}
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: cで書いたプログラムをCGIで動かしたい
それだと簡単なC言語のCGIでテストしていない事になりますが間違い無いですか?
OKなのはPerlだけですよね?
参考。C++をhttpdで動かす。
「CGIの動作チェック方法」
http://www30.tok2.com/home/cc/@cc/conte ... 03-01.html
調査中。
OKなのはPerlだけですよね?
参考。C++をhttpdで動かす。
「CGIの動作チェック方法」
http://www30.tok2.com/home/cc/@cc/conte ... 03-01.html
調査中。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
blade
Re: cで書いたプログラムをCGIで動かしたい
perlのが動くだけじゃだめなのですね。softya(ソフト屋) さんが書きました:それだと簡単なC言語のCGIでテストしていない事になりますが間違い無いですか?
OKなのはPerlだけですよね?
今以下のC言語のプログラムにおいて実験しましたが現状はCでは動きませんでした。
以下のソースを実行形式exeにして拡張子を.cgiにしてサーバにアップしましたが
同じくデータを受信していないとなってしまいました。
rei.cgi
#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");
}
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: cで書いたプログラムをCGIで動かしたい
ローカルじゃなく何処かのレンタルサーバなのでしょうか?
レンタルサーバで動かす時は
1.レンタルサーバーが実行ファイル型のCGIを許可していること。
2.レンタルサーバーの上でコンパイルできること
の条件を満たす必要があります。
レンタルサーバで動かす時は
1.レンタルサーバーが実行ファイル型のCGIを許可していること。
2.レンタルサーバーの上でコンパイルできること
の条件を満たす必要があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: cで書いたプログラムをCGIで動かしたい
cgiで標準入力は使えないんじゃないでしょうか。
C言語でのcgiのサンプルではリクエストの情報は環境変数から読んでいます。
C言語でのcgiのサンプルではリクエストの情報は環境変数から読んでいます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: cで書いたプログラムをCGIで動かしたい
見逃していましたが、私も使えないと思います。h2so5 さんが書きました:cgiで標準入力は使えないんじゃないでしょうか。
C言語でのcgiのサンプルではリクエストの情報は環境変数から読んでいます。
と言うかローカルでhttpサーバーを使ってテストしていないのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
blade
Re: cで書いたプログラムをCGIで動かしたい
ローカルで使っています。
正しく動かす前に今はとりあえず
データを受信していません
の状態をどうにかしたいのでその部分は後で直したいと思います。
それとも環境変数の件をどうにかしないとこの問題は解決できないのでしょうか。
すみません、その辺はまだ勉強していないのでよくわからないのですが、cgiで標準入力は使えないんじゃないでしょうか。
C言語でのcgiのサンプルではリクエストの情報は環境変数から読んでいます。
正しく動かす前に今はとりあえず
データを受信していません
の状態をどうにかしたいのでその部分は後で直したいと思います。
それとも環境変数の件をどうにかしないとこの問題は解決できないのでしょうか。
Re: cで書いたプログラムをCGIで動かしたい
入力をしないで出力だけしてみては?
Re: cで書いたプログラムをCGIで動かしたい
そもそもCGIというのはサーバーでプログラムを実行するための仕組みを指す言葉です。
サーバー側でcgi拡張子をperlで実行するという設定になっていたら、exeファイルをperlに読ませることになります。
とりあえずWebサーバーは何なのか、Webサーバーがexeを実行する設定になっているのか、という点が不明ですが。
Visual Studioから実行しているならIISですかね。
うろ覚えですが、環境変数か標準入力かは、GET/POSTの違いではなかったでしょうか。
サーバー側でcgi拡張子をperlで実行するという設定になっていたら、exeファイルをperlに読ませることになります。
とりあえずWebサーバーは何なのか、Webサーバーがexeを実行する設定になっているのか、という点が不明ですが。
Visual Studioから実行しているならIISですかね。
うろ覚えですが、環境変数か標準入力かは、GET/POSTの違いではなかったでしょうか。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: cで書いたプログラムをCGIで動かしたい
こっちの問いにもお応えください。実行する環境が不明確なので誰も的確に答えられません。
レンタルサーバの場合は以下のとおりで、ローカルサーバーならHTTPサーバーの正式な名称や詳細な環境などを明かしてください。
レンタルサーバの場合は以下のとおりで、ローカルサーバーならHTTPサーバーの正式な名称や詳細な環境などを明かしてください。
ローカルサーバーならsoftya(ソフト屋) さんが書きました:ローカルじゃなく何処かのレンタルサーバなのでしょうか?
レンタルサーバで動かす時は
1.レンタルサーバーが実行ファイル型のCGIを許可していること。
2.レンタルサーバーの上でコンパイルできること
の条件を満たす必要があります。
どういう意味でアップロードと呼んでいますか?以下のソースを実行形式exeにして拡張子を.cgiにしてサーバにアップしましたが
同じくデータを受信していないとなってしまいました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
blade
Re: cで書いたプログラムをCGIで動かしたい
httpdで設定したローカルホストのcgi-bin/にファイルをエクスプローラでコピペしました。softya(ソフト屋) さんが書きました:こっちの問いにもお応えください。実行する環境が不明確なので誰も的確に答えられません。
レンタルサーバの場合は以下のとおりで、ローカルサーバーならHTTPサーバーの正式な名称や詳細な環境などを明かしてください。ローカルサーバーならsoftya(ソフト屋) さんが書きました:ローカルじゃなく何処かのレンタルサーバなのでしょうか?
レンタルサーバで動かす時は
1.レンタルサーバーが実行ファイル型のCGIを許可していること。
2.レンタルサーバーの上でコンパイルできること
の条件を満たす必要があります。どういう意味でアップロードと呼んでいますか?以下のソースを実行形式exeにして拡張子を.cgiにしてサーバにアップしましたが
同じくデータを受信していないとなってしまいました。
私はこれでアップロードできたと思っています。
レンタルサーバは使っていません。
CGIの許可はありましたが設定をみたところ、.cgiの実行プログラムは
C:\Perl\bin\perl.exe
で、(他のexeなどの実行プログラムの設定はしていませんでした。)
cgiはperl.exeで動かすようになっていました。
ここをどうにかすればいいのでしょうか。
サーバ上でコンパイルする環境はありません。
別のDocuments/Visual studio/の中でコンパイルしたものを設定したローカルホストのcgi-bin/にコピペしています。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: cで書いたプログラムをCGIで動かしたい
httpdと呼んでいるものは、これですか?
「AN HTTPD Home Page」
http://www.st.rim.or.jp/~nakata/
httpdってhttpデーモンの略で他にも同じ名前のモノがあります。
【補足】正確にはApacheなどもhttpdと呼びます。
「httpdとは【HyperText Transfer Protocol Daemon】(HTTPデーモン) - 意味/解説/説明/定義 : IT用語辞典」
http://e-words.jp/w/httpd.html
AN HTTPDなら以下の真似をすれば動くと思います。
「[05/04/17 23:23] C言語のCGIの実行方法が分からない」
http://homepage1.nifty.com/yito/namazu/ ... .2323.html
「AN HTTPD Home Page」
http://www.st.rim.or.jp/~nakata/
httpdってhttpデーモンの略で他にも同じ名前のモノがあります。
【補足】正確にはApacheなどもhttpdと呼びます。
「httpdとは【HyperText Transfer Protocol Daemon】(HTTPデーモン) - 意味/解説/説明/定義 : IT用語辞典」
http://e-words.jp/w/httpd.html
AN HTTPDなら以下の真似をすれば動くと思います。
「[05/04/17 23:23] C言語のCGIの実行方法が分からない」
http://homepage1.nifty.com/yito/namazu/ ... .2323.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
blade
Re: cで書いたプログラムをCGIで動かしたい
そうです、これです!
そしてリンク先のコメント集を見て設定したところ動きました。
説明不足でしたのにここまで示して下さりありがとうございました。