ページ 11

cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 03:27
by blade
cgi初心者です。

cで書いたプログラムをCGIで動かしたいのですが、ブラウザでローカルホストに接続してファイルにアクセスしようとしても
データを受信していません
と表示され、正しく動作しません。

私が作ったものではない同じフォルダにあるcgiファイルはちゃんと動くのですが、
私のは動きません。
Visual Studio 2010で.exeファイルを生成して、その名前を変えて拡張子を.cgiにし指定のフォルダに置いたのですが
ダメでした。ソースの.cファイルも拡張子cgiにしたのですがダメでした。

ソースをコンパイルして出力ファイル名を***.cgiにするなどの工程を踏まないといけないのでしょうか。
または他に何か必要な要素があるのでしょうか。

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 06:53
by ガンちゃん
根本的なミスを犯してると思います

.cをcgiに変えて鯖に置くだけでいいです

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 07:20
by beatle
.cは単なるソースファイルなので、.cgiに変えても動かないと思いますよ。
.cをコンパイルして.exeにして配置する、というのは方向性はOKです。
作ったプログラムに問題があるのかその他に問題があるのか(例えば配置方法)は現時点では分かりません。
取り敢えずそのプログラムのソースコードを貼り付けて皆で見ませんか?

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 11:47
by softya(ソフト屋)
そもそもapache などのcgiが動くサーバは稼働してして、ちゃんと設定されているんでしょうか?
「C言語、C++言語でCGI」
http://gogodiet.net/z/tips/1.htm

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 17:41
by blade
httpdでcgiサーバを設定して、テストとしてこのtest.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";
私の書いたソースなのですが、主に処理内容スペースとcgi出力スペースにわかれているのですが、
処理内容スペースは個人的な情報が多く書いてあったりでここに貼るのはひかえさせてもらってもよろしいでしょうか。
コマンドライン上では正しく動きましたのでそこでエラーはないと思います。

コード:

#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;
}


Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 17:45
by softya(ソフト屋)
それだと簡単なC言語のCGIでテストしていない事になりますが間違い無いですか?
OKなのはPerlだけですよね?

参考。C++をhttpdで動かす。
「CGIの動作チェック方法」
http://www30.tok2.com/home/cc/@cc/conte ... 03-01.html

調査中。

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 17:54
by blade
softya(ソフト屋) さんが書きました:それだと簡単なC言語のCGIでテストしていない事になりますが間違い無いですか?
OKなのはPerlだけですよね?
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");

}

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 17:56
by softya(ソフト屋)
ローカルじゃなく何処かのレンタルサーバなのでしょうか?
レンタルサーバで動かす時は
1.レンタルサーバーが実行ファイル型のCGIを許可していること。
2.レンタルサーバーの上でコンパイルできること
の条件を満たす必要があります。

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 17:59
by h2so5
cgiで標準入力は使えないんじゃないでしょうか。
C言語でのcgiのサンプルではリクエストの情報は環境変数から読んでいます。

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 18:02
by softya(ソフト屋)
h2so5 さんが書きました:cgiで標準入力は使えないんじゃないでしょうか。
C言語でのcgiのサンプルではリクエストの情報は環境変数から読んでいます。
見逃していましたが、私も使えないと思います。
と言うかローカルでhttpサーバーを使ってテストしていないのでしょうか?

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 18:08
by blade
ローカルで使っています。
cgiで標準入力は使えないんじゃないでしょうか。
C言語でのcgiのサンプルではリクエストの情報は環境変数から読んでいます。 
すみません、その辺はまだ勉強していないのでよくわからないのですが、
正しく動かす前に今はとりあえず
データを受信していません
の状態をどうにかしたいのでその部分は後で直したいと思います。
それとも環境変数の件をどうにかしないとこの問題は解決できないのでしょうか。

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 18:10
by h2so5
入力をしないで出力だけしてみては?

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 18:11
by ISLe
そもそもCGIというのはサーバーでプログラムを実行するための仕組みを指す言葉です。

サーバー側でcgi拡張子をperlで実行するという設定になっていたら、exeファイルをperlに読ませることになります。

とりあえずWebサーバーは何なのか、Webサーバーがexeを実行する設定になっているのか、という点が不明ですが。
Visual Studioから実行しているならIISですかね。


うろ覚えですが、環境変数か標準入力かは、GET/POSTの違いではなかったでしょうか。

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 18:13
by softya(ソフト屋)
こっちの問いにもお応えください。実行する環境が不明確なので誰も的確に答えられません。

レンタルサーバの場合は以下のとおりで、ローカルサーバーならHTTPサーバーの正式な名称や詳細な環境などを明かしてください。
softya(ソフト屋) さんが書きました:ローカルじゃなく何処かのレンタルサーバなのでしょうか?
レンタルサーバで動かす時は
1.レンタルサーバーが実行ファイル型のCGIを許可していること。
2.レンタルサーバーの上でコンパイルできること
の条件を満たす必要があります。
ローカルサーバーなら
以下のソースを実行形式exeにして拡張子を.cgiにしてサーバにアップしましたが
同じくデータを受信していないとなってしまいました。
どういう意味でアップロードと呼んでいますか?

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 18:36
by blade
softya(ソフト屋) さんが書きました:こっちの問いにもお応えください。実行する環境が不明確なので誰も的確に答えられません。

レンタルサーバの場合は以下のとおりで、ローカルサーバーならHTTPサーバーの正式な名称や詳細な環境などを明かしてください。
softya(ソフト屋) さんが書きました:ローカルじゃなく何処かのレンタルサーバなのでしょうか?
レンタルサーバで動かす時は
1.レンタルサーバーが実行ファイル型のCGIを許可していること。
2.レンタルサーバーの上でコンパイルできること
の条件を満たす必要があります。
ローカルサーバーなら
以下のソースを実行形式exeにして拡張子を.cgiにしてサーバにアップしましたが
同じくデータを受信していないとなってしまいました。
どういう意味でアップロードと呼んでいますか?
httpdで設定したローカルホストのcgi-bin/にファイルをエクスプローラでコピペしました。
私はこれでアップロードできたと思っています。

レンタルサーバは使っていません。
CGIの許可はありましたが設定をみたところ、.cgiの実行プログラムは
C:\Perl\bin\perl.exe
で、(他のexeなどの実行プログラムの設定はしていませんでした。)
cgiはperl.exeで動かすようになっていました。
ここをどうにかすればいいのでしょうか。

サーバ上でコンパイルする環境はありません。
別のDocuments/Visual studio/の中でコンパイルしたものを設定したローカルホストのcgi-bin/にコピペしています。

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 18:48
by softya(ソフト屋)
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

Re: cで書いたプログラムをCGIで動かしたい

Posted: 2013年1月10日(木) 19:24
by blade
softya(ソフト屋) さんが書きました:httpdと読んできるものは、これですか?
「AN HTTPD Home Page」
http://www.st.rim.or.jp/~nakata/
そうです、これです!
そしてリンク先のコメント集を見て設定したところ動きました。

説明不足でしたのにここまで示して下さりありがとうございました。