トップページ⇒php
507コメント145KB

C言語CGI専用スレッド

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2001/05/04(金) 04:31ID:???
C/C++ CGI 専門のスレッドです。
PERL-CGI の情報はどこでも手に入りますけど
C-CGI の情報は少ないです。
C言語のCGIに関することはここに書きましょう。

スクリプトを検索できるサイトです。

http://script.lovely.to/search/home_script_c.html
http://cgi.resourceindex.com/Programs_and_Scripts/C_and_C++/
http://www.cgifiles.com/scripts/cc++/index.shtml

前スレ
http://tako.2ch.net/test/read.cgi?bbs=perl&key=971762830
0002続・元スレ2001/05/04(金) 05:01ID:Sv87XwuU
138 名前:むぎ茶 投稿日:2001/04/26(木) 08:18
http://www.mietsu.tsu.mie.jp/freak/index.shtml
CGIというよりPerlみたいなもの?
139 名前:名無しさん 投稿日:2001/04/26(木) 16:48
>>138
TOPページが異様に重いんでやめちゃった。
何のサイトなの?
140 名前:名無しさん 投稿日:2001/04/26(木) 17:36
CGIというよりPerlみたいなもの?<意味不明
141 名前:名無しさん 投稿日:2001/04/28(土) 10:34
>>138
これとC言語と何の関係が?重いので自分も途中でやめたが・・・
---------------------------------------------------------

http://www.mietsu.tsu.mie.jp/freak/freakgarden.shtml
にC++のCGIあるよ。
0003名無しさん@お腹いっぱい。2001/05/07(月) 01:25ID:Vdb34f9c
STLを使えば連想配列を作れるって雑誌で読んだのだが、
実際にCGIで使ってる人っているのかな?
0004名無しさん@お腹いっぱい。2001/05/07(月) 04:01ID:lCHmlcCs
Perlの自作掲示板をC++に書き換えたわずかな経験しかないけど、
STL(というかSTLを含むC++標準ライブラリ)は、むっちゃ便利だよ。

ただし正規表現の処理はちょっと面倒みたい。
flexなんかが使える人なら、もっと楽にできると思うのだが、
おれはflexのfの字も知らないので、元のPerlスクリプトから
正規表現をできるだけ減らして、あとは単なる文字列置換で
切り抜けました。
0005名無しさん@お腹いっぱい。2001/05/10(木) 17:29ID:???
みんなそんなに正規表現使ってるんでしょうか。
作るものによるのでしょうけど。

C++は開発環境が圧倒的に整っているのがいいですね。
統合環境でソースレベルデバッグ、ローカル変数を覗くのも簡単だし。
簡単なCGIなら、手軽にPerlで十分ですけど。
0006名無しさん@お腹いっぱい。2001/05/10(木) 21:43ID:8zuGcixU
>>5
統合環境について同意。
おれもVC++6でデバッグしてます。
でもサーバのgccが古くてSTLがダメダメだったりしないですか?
最新版のgccとlibstdc++をいれればいいとは思うんだけど
面倒でやってない。
0007名無しさん@お腹いっぱい。2001/05/11(金) 11:36ID:0Xa628kc
>おれもVC++6でデバッグしてます。
>でもサーバのgccが古くてSTLがダメダメだったりしないですか?

わー、同じやり方の人がいて嬉しい。
サーバのgccは、2.95以降が無ければ自分でいれます。
2.70だと使い物にならないよね。
0008名無しさん@お腹いっぱい。2001/05/12(土) 11:25ID:4BHhF8Kc
C++使いたいけど、なぜかサポートしてくれるISPが少ないような?
000962001/05/12(土) 14:46ID:9XwDBRCc
>>7
やっぱ古いSTLのままじゃだめっすよね。
素直に今からgcc2.95入れます。

gccのサイトを見ると、C++標準ライブラリの最新版がgcc本体と
別にあるみたいなんですが、=> http://gcc.gnu.org/libstdc++/
これも入れたほうがいいんでしょうか?

>>8
ISPがLinuxとかなら、ローカルに同じ環境を作ってコンパイルして
実行ファイルだけ上げるとか・・・。今度試してみます。
0010名無しさん@お腹いっぱい。2001/05/13(日) 04:10ID:ZfAWLiIw

fprintf( log, "REMOTE_HOST....%s <br>", getenvs( "REMOTE_HOST" ) );
fprintf( log, "REMOTE_ADDR....%s <br>", getenvs( "REMOTE_ADDR" ) );
fprintf( log, "REMOTE_PORT....%s <br>", getenvs( "REMOTE_PORT" ) );
0011名無しさん@お腹いっぱい。2001/05/13(日) 04:15ID:ZfAWLiIw
fprintf( log, "REMOTE_HOST....%s <br>", getenvs( "REMOTE_HOST" ) );
fprintf( log, "REMOTE_ADDR....%s <br>", getenvs( "REMOTE_ADDR" ) );
fprintf( log, "REMOTE_PORT....%s <br>", getenvs( "REMOTE_PORT" ) );

このようなソースでアクセス解析を行ったのですが、REMOTE_HOSTだけが
取得できません、どうやら特別な操作が必要なようですが自分にはさっぱりです。
良ければ誰かどのようにしてREMOTE_HOSTを取得するのかソースで教えてくれませんか?
0012112001/05/13(日) 04:19ID:ZfAWLiIw
http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/index.html
此処のページがとても有意義です。
0013112001/05/13(日) 04:21ID:ZfAWLiIw
char *getenvs( char *str )
{
char *ev = getenv( str );
if( ev == NULL ) { ev = "none"; }
return ev;
}
さっきから多重投稿ですいません。
11のソースで使われている関数です。
0014名無しさん@お腹いっぱい。2001/05/13(日) 05:06ID:???
>>11
マルチポスト野郎は死ね。

って事でこういう馬鹿には答えない方針でいきませう。>おおる
0015名無しさん@お腹いっぱい。2001/05/13(日) 05:48ID:???
>>14
確かにマルチポストだ。レンサバ板の旧スレッドにも書いてる。

>>11
これに答えると今後しめしがつかないから。悪いね。
まあ簡単にできるんで調べてみれ。
0016名無しさん@お腹いっぱい。2001/05/13(日) 16:29ID:lOGH6AnI
>ISPがLinuxとかなら、ローカルに同じ環境を作ってコンパイルして
>実行ファイルだけ上げるとか・・・。今度試してみます。

基本的にこれだと思うけど、perlのCGIは許可しても、バイナリの実行は
許可しないISPもあると聞いたので注意。
Apacheとかそういう設定できたっけ?
バイナリでも拡張子を .pl にしたら実行できちゃったりして。
0017名無しさん@お腹いっぱい。2001/05/13(日) 16:31ID:lOGH6AnI
↑バイナリでも拡張子を .pl にしたら実行できちゃったりして。

外部のperlを呼び出してるならともかく、mod_perlみたいに組み込まれた
物だったら強制的にperlスクリプトとして処理されるか。
0018112001/05/13(日) 16:36ID:bVNqra6E
さっきは本当にすいません、十分に反省しました。

struct hostent *hptr;
hptr = gethostbyaddr( (char*)getenv( "REMOTE_ADDR" ), 4, AF_INET );
printf( "Content-type: text/plain\n\n" );
printf( "%s<br>", hptr->h_name );

何とか自分で調べて gethostbyaddr関数を使えばよいと
いうところまでは解りました。
ただ上のソースでコンパイルエラーはでないのですが
実行エラーがでてしまいます。
どうやら gethostbyaddr関数の使い方が悪いようなのですが。
自分には一番目の引数以外、gethostbyaddr関数の意味が分かりません。
もう二度とマルチはいたしませんので
どうか gethostbyaddr関数の引数、戻り値の意味と使い方を教えて下さい。
ついでにヘッダーファイル名も教えてもらえませんか。
解らないので、すべてのヘッダーを羅列しているのです。
0019名無しさん@お腹いっぱい。2001/05/13(日) 21:53ID:???
>>18
その素直さと、gethostbyaddrを自力で見つけてきた努力を
評価して答えさせてもらいます。いいですね>ここの住人

gethostbyaddrの第1引数は、IPアドレスを4バイトにパックしたもの。
たとえば"127.0.0.1"というIPアドレスなら
char addr[4]={0x7F,0x00,0x00,0x01};
↑このような4バイトのchar配列にして渡せばよい。

"127.0.0.1"のような文字列と、4バイト形式のIPアドレスを
相互に変換するinet_aton、inet_ntoaという関数もある。
ただし歴史的な事情で、これらの関数では、4バイト形式のIPアドレスを
in_addrという構造体で表すので注意。(たいていここで混乱する)

"127.0.0.1"などの文字列形式を4バイトにパックするために、
gethostbynameやgethostbyaddrの戻り値を利用してもよい。
たとえば、こんな感じ。

struct hostent *hptr;
hptr = gethostbyname( (char*)getenv( "REMOTE_ADDR" ) );
hptr = gethostbyaddr( hptr->h_addr, hptr->h_length, hptr->h_addrtype );
printf("%s", hptr->h_name);

これは最初のgethostbynameでhptrのh_addr、h_length, h_addrtypeを
取得し、それを使って今度はgethostbyaddrを呼ぶことで、h_nameを
取得しているわけ。

手元のFreeBSDでは、必要なヘッダはsys/types.hとnetdb.hだった。
これはOSによって違うかも?
そのへんは man gethostbyaddrでわかるんじゃないかな。
0020112001/05/14(月) 02:59ID:r0Z2G3wg
>>19
なんとか、出来ました。
こんな自分にも、わざわざ教えて下さって本当に感謝します。
そしてこれからも精進していこうと思います。
0021名無しさん@お腹いっぱい。2001/06/24(日) 18:36ID:65Gxh8rs
gcc-3.0が出たよ。
http://gcc.gnu.org/gcc-3.0/gcc-3.0.html
libstdc++の最新版も入ったそうなのでSTLがまともになってることを期待。
0022名無しさん@お腹いっぱい。2001/06/25(月) 00:32ID:pEls8e6Q
掲示板を作ってみたんですけど、入力文章に"「"、"」"があると止まってしまいます。なんででしょ?
0023名無しさん@お腹いっぱい。2001/06/25(月) 01:23ID:k5UlKqNo
<form method='POST' action="http://aaa/ssss.cgi">
<input type=hidden name="get" value="143242341324">
<input type=submit value="abcd">
</form>
これをTELNETで見ようと思ってもサッパリ分かりませんでした
いま将棋とオセロにはまってます
このCGIの出力結果を見るにはどんな文ををサーバーに送れば見ることが出来ますか?
詳しく分かりやすく専門用語を使わずに教えてくださいおしえてください
0024名無しさん@お腹いっぱい。2001/06/25(月) 09:52ID:???
>>23 氏ね
0025>>232001/06/25(月) 15:41ID:???
オセロと将棋って何か関係あんの?
0026名無しさん@お腹いっぱい。2001/06/26(火) 21:35ID:euzbuCB2
>>23 はバカだねえ
0027名無しさん@お腹いっぱい。2001/06/30(土) 18:41ID:???
スマソ、まったくCは素人なんだがLinuxのGCCだけで作れるものなのか?
Windowsだと金かかるのか?
初心者向けサイトにもその辺りは何にも書いてないぞ(^^;
0028名無しさん@お腹いっぱい。2001/06/30(土) 19:19ID:fH7f8wxQ
>>27
C言語でCGIを作るなら、WEBサーバと同じOS環境が必要だよ。
たとえばLinuxのGCCで作ったCGIをアップするなら、
そのCGIを置くWEBサーバもLinuxじゃないと動作しない。
WindowsのVC++とかで作ったCGIは、Windowsサーバじゃないとだめ。
0029七資産2001/07/01(日) 01:20ID:???
>>27
基本はwebサーバにftpでソースファイルを送ったあと、
telnetでログインしてコンパイルする。

Cコンパイラにどういうものを用意してくれているかは
ISPに聞いてくださいな。そこまではさすがに面倒
見きれない。
0030272001/07/01(日) 13:05ID:???
ありがとう、サーバーがLinuxだからそのままでよさそうでした
0031JAPU2001/07/01(日) 19:23ID:???
クロスコンパイル環境整えればどんなOS用でもOKという話もあり。
(面倒だけど。)
0032名無しさん@お腹いっぱい。2001/07/01(日) 19:39ID:n8uZvlf2
Windowsで動くクロスコンパイル環境ほしいー。

てゆーかGCCだとSTLのヘッダを読み込むのが遅くて困ってます。
VC++みたいなヘッダのプリコンパイル機能ってあります?
gccのマニュアルざっとみたけど見つからないの。。。
0033名無しさん@お腹いっぱい。2001/07/02(月) 01:20ID:7DkK5h6g
で、C++を使える鯖ってどっかある?
0034名無しさん@お腹いっぱい。2001/07/02(月) 02:19ID:???
>>33
ローカルでコンパイルすればいいじゃん。
まあサーバにC++関連のsharedライブラリが入ってないつー
場合もあるけど、そんなときはstaticリンクで乗り切れ。
0035名無しさん@お腹いっぱい。2001/07/03(火) 20:23ID:???
っつーかC/C++言語でCGIを書く奴はふつー自前サーバ。
仕事なら当然だが、趣味でも最近はみんな自前サーバ立ててるな。
おれもそうだ。
0036名無しさん@お腹いっぱい。2001/07/04(水) 23:58ID:RFlJOQ32
んー。flexか。ちと研究してみよっかな。
0037名無しさん@お腹いっぱい。2001/07/05(木) 00:09ID:M8XJRojU
GNU regex.c というものもあるのね。
誰か使った人いる?
0038弐ch編者2001/07/06(金) 21:14ID:???
晒し上げ
0039JAPU2001/07/06(金) 22:25ID:???
GNU のやつはしらんが、BSD 由来の方は使ったことある。
とりあえず、あまり参考にならないと思うけど輪講用に適当にでっち上げたもの:
http://www.japu.org/tmp/http.c

httpd.c の方はあまりにも汚くなったので捨てました。
0040名無しさん@お腹いっぱい。2001/07/10(火) 18:49ID:???
ちょっと質問です、CでCGIを作ろうと思ったんですがCはまったくの初心者
何か便利なモジュールとかってないんですか?
0041名無しさん@お腹いっぱい。2001/07/10(火) 18:56ID:???
↑
とりあえず共用鯖では絶対に動かそうと思うなよ。
0042名無しさん@お腹いっぱい。2001/07/10(火) 19:20ID:???
↑なんでだよ。
許されている物を動かして、鯖が止まったならば鯖缶の責任。
0043名無しさん@お腹いっぱい。2001/07/10(火) 20:26ID:???
↑
サイアク。
やりたいなら自分の鯖でやれ。
0044名無しさん@お腹いっぱい。2001/07/10(火) 21:53ID:???
すげー理論だ。

だいたいの鯖屋の規約には「運用に支障をきたす」云々が有るから、
鯖が止まるようなものは「許されている物」じゃねーけどな。

つことで結局、いきなり共用鯖では動かさないでね(ハァト
0045名無しさん@お腹いっぱい。2001/07/10(火) 22:09ID:???
>>44
>鯖が止まるようなものは「許されている物」じゃねーけどな。
そうだよね。
バグチェックして、鯖管にソース見せて許可貰えば
共用鯖で動かしてもいいんだよね。
それで落ちたら鯖管の責任。
# そこまで(ソース見せる)しなくてもいいとは思うけど。
# 自鯖で正常に動作すればいいでしょ。
# 責任は自分にあるけど。

と言うことで、>>42に同意。

まあ、
>>40が「いきなり共用鯖で動かす」とも、
>>41が「入念なテストの後に共用鯖で動かすのも駄目」とも、
>>42が「いきなり共用鯖で動かしても良い」とも、
「↑」が何番の発言を指すのか、とも、
全く何処にも書かれていないのですがね。
0046402001/07/11(水) 01:01ID:???
すいません、見てみたら突然こんなことになってまして
ちゃんと自鯖で動かします。
0047名無しさん@お腹いっぱい。2001/07/11(水) 01:14ID:???
># 自鯖で正常に動作すればいいでしょ。
負荷かけまくるのはダメだろ。正常に動いても。

共用鯖はローカルとは違い、他の人も使ってることを忘れずに。
ローカルでは落ちなくても、共用鯖では落ちるって事もあるから。

#負荷大きくないのに落ちたなら、鯖管の負荷計画が拙いって事になるけどね。
0048452001/07/11(水) 15:55ID:???
>>47
>負荷かけまくるのはダメだろ。正常に動いても。
うん、そうだね。
ちなみに、私は共用鯖で負荷かけまくりな物を
動かすような非常識な人間を対象に書いたつもり
じゃないです。
ここ見てる人がそんな非常識な訳がないと思う…
0049名無しさん@お腹いっぱい。2001/07/12(木) 12:43ID:djup2iK6
>>12

12のページかなり必要なネタが網羅されていていいね。
参考にしよう。
0050名無しさん@お腹いっぱい。2001/07/14(土) 16:33ID:gnTS0OVs
この情報ならここに沢山あるよ
変なURLに見えるけど内容は確か。
ttp://members.tripod.co.jp/casinoA1/
0051名無しさん@お腹いっぱい。2001/07/15(日) 23:15ID:???
ざっとCの参考書みてみたけど別に難しくはなさそうだね
参考書に書いてあった
int main(){
/*適当なくだらん処理*/
hoge();
return 0;
}

void hoge(void)
{
/*printfのなんか適当な処理*/
}

ってユーザー定義関数ではしばらくvoidを使いなさいって書いてあったんだが
コンパイルするときにhogeはintにしましょうみたいなエラーがでるんだが・・
実際にvoidを省略するとコンパイル&実行できるんだが。。。
深く考えるのはやめとくか。。。
0052名無しさん@お腹いっぱい。2001/07/17(火) 21:51ID:ZAF8cotQ
session管理age(w
0053JAPU2001/07/18(水) 12:06ID:???
1. エラーメッセージは自分で適当に解釈せず、そのまま提示しましょう。
2. プロトタイプ宣言しないと int hoge(); と見なされちゃうというお約束。
3. というか、printf 使うなら #include <stdio.h> 必要では?
0054名無しさん@お腹いっぱい。2001/07/19(木) 18:58ID:???
#include <stdio.h>
#include <math.h>

void amount(int kingaku,int nensuu,float riritu)
{
int i;
printf("金額%d円\n%d年返済\n利率%f%\n",kingaku,nensuu,riritu);

for(i = 0;i <= nensuu;i++)
{
printf("%3d 年後の元利合計 = %.0f 円\n",i,kingaku*pow((1+(riritu/100)),(i+1)));
}
}

int main()
{
int k;
int n;
float r;

do{
printf("元金の金額は?\n");
scanf("%d",&k);
}while (k < 0);

do{
printf("年数は?\n");
scanf("%d",&n);
}while (n < 0);

do{
printf("利率は?\n");
scanf("%f",&r);
}while (r < 0);

amount(k,n,r);

return 0;

}
0055542001/07/19(木) 18:58ID:???
ごめん、板間違えた
0056わ、2001/07/20(金) 03:38ID:O.8zSDuM
age
0057名無しさん@お腹いっぱい。2001/07/21(土) 10:24ID:???
あげましょうか?
■ このスレッドは過去ログ倉庫に格納されています