トップページ⇒php
529コメント163KB

C言語のCGIを語りつつ普及するスレ

■ このスレッドは過去ログ倉庫に格納されています
0001somebodyさん03/03/23 13:20ID:???
C言語で書かれたCGIってなかなかイイもの見つかりませんよね。

前Cでかかれた掲示板を見かけたんですけど、なんかタグ用の処理が行われていないらしくて、グロ画像やエロ画像なんて
貼りたい放題でしたよ・・。わたしなんて<xmp>タグを貼りかけましたよ・・・

それはどうでもイイとしてKENTさんのCGIみたいに高機能で手軽なCGIのC言語版みたいなのがあったらなぁなんて思ったことありませんか?
このスレではそんなCGIについて語って、CでCGIの考えを普及していきたいです。
0175nobodyさん03/04/13 20:40ID:???
ちなみにmod_perlが速いっていうのは
普通のPerlのスクリプトは
コンパイル→中間コード→実行
という手順だけど
mod_perlだと
最初の一回だけコンパイル→中間コード→実行で
次からはコンパイルをしないで中間コード→実行
となるんで劇的に速くなる。

PHPはコンパイル→中間コード→実行なんで
多少それよりかは落ちるかも・・・
PHPAとか中間コードを残すのもあるけど
まだ出始めで微妙だね。
0176173,17503/04/13 20:42ID:???
>>174
mod_perlとかmod_phpとかと比べたらCGIとしては
多少オーバーヘッドが大きいと言いたかっただけなんだが・・・
見当違いだったらスマソ
0177nobodyさん03/04/13 21:07ID:???
>>176
じゃあ、Cでモジュール作るってのが最強だと思うんだが。
0178173,17503/04/13 21:13ID:???
>>177
多分ね。
でもCGI如きでそこまでするやつは少ないだろ
0179nobodyさん03/04/13 21:23ID:???
>>178
Cでモジュール作るだけでは飽きたらずPerl実行環境にしてしまったmod_perlの作者はアホだと言うことに。
0180nobodyさん03/04/13 21:41ID:???
>>179
焦点が合ってない。
0181nobodyさん03/04/13 21:42ID:???
つーか言語比較はスレ違いだろ。ここはC/C++ってのが前提なんだから。
0182nobodyさん03/04/13 21:46ID:???
昔ゆいちゃっとのC言語版配布されてたよな・・・
今もされてるのだろうか
0183nobodyさん03/04/13 22:53ID:???
>>181
C++はスレ違い
0184nobodyさん03/04/13 23:02ID:???
>>183
さて、可変長文字列の扱いが地獄のように面倒になるわけだが。
0185Perl、PHP、C、HTMLファイルにして読む03/04/14 00:32ID:dnrQZih1
HTMLファイルを読むのと、PerlやCとの比較がないのだが!
0186nobodyさん03/04/14 00:49ID:???
いちばんお薦めなのは、機械語でWebサーバと専用CGIをセットで開発する

ことだぜい!

結構速いYO!
0187nobodyさん03/04/14 02:07ID:???
>>186
それは理想だが、実際に
機械語・アセンブラで本当にCGIを書く気ある?
あるわけ無いよな。

それに一番近いのが、Cで開発するって事だろう。
最初はPerlで書かれていた2ちゃんねるのCGIも、
アクセス増加でサーバ負荷が高くなり、Cで書き直されたらしいし。

0188nobodyさん03/04/14 06:07ID:???
>>187
彼はWebサーバごとスクラッチしろと言っているのですよ。
0189nobodyさん03/04/14 17:47ID:???
>178
モジュールと言わずとも、FastCGIって手もある。
http://www.fastcgi.com/
いずれにしてもモジュール組み込まなきゃならないから、
root持ってないと辛いけど。
遊びで動かしてる自宅鯖とかなら無問題。
あと、C++で楽しいライブラリ知らない?
一応cgiccてのは見付けたけど、いかにもGNUな田舎臭い
ライブラリなんだよなあ。
0190nobodyさん03/04/14 20:28ID:???
>あと、C++で楽しいライブラリ知らない?

WTLとか。
0191nobodyさん03/04/14 20:45ID:???
C++で楽しいライブラリ作らない?
0192nobodyさん03/04/14 20:48ID:???
>>191
MFCとか。
0193nobodyさん03/04/15 00:34ID:???
結局このスレの住人は、誰一人
C言語でCGIを書いた奴はいないようだな。
脳内プログラミング…
0194nobodyさん03/04/15 01:48ID:CDjnnd9Z
>>193
ん、実際に作って自分のsiteで使ってるよ。
新たにperl覚えるのもメンドイし。
簡単なbbsとアクセスログ付きカウンタだけだけどね。
簡単なライブラリも作ったけど、
さすがに人様にお見せできるレヴェルじゃないので(w

一応Servletもつかえる環境構築しだけど
家かえってまでそんな大掛かりなコーディングしないし。。
0195nobodyさん03/04/15 02:11ID:???
>>193
書いた事はあるけど、共有鯖で使うのはちょと怖い。
安全性を担保できる方法を考えてます。
0196fusianasan03/04/16 19:33ID:???
いまCのデコード作業やってんだけど・・・
日本語処理が難しいね。
バイナリがどうのこうのって、なかなかうまく逝きません。

ヒントを所望したい。
0197nobodyさん03/04/16 20:53ID:???
標準ライブラリがワイド文字ライブラリを用意しているのに・・・
0198nobodyさん03/04/16 21:27ID:???
ロケール指定を忘れるな。
019919403/04/17 00:45ID:???
>>196

デコード自体はマルチバイト意識しなくてもいいんやん?
あ、俺が作った時はあくまで個人用途なので
ちゃんと試験したらボロボロかもしれんが(w

文字コード関係は自作せず、nkfのソースをぱくったYO!
どっかのサイトで見本があったので。
0200nobodyさん03/04/17 05:56ID:???
>>197
まともに実装されているとは限りません。
wchar_t == UCS-2でも幸せな部類です。
しかもCGIなので、どのencodingが飛んで来るかも分からない
ので、ワイド文字関係は基本的に使えません。
0201山崎渉03/04/17 12:00ID:???
(^^)
0202fusianasan03/04/17 18:05ID:???
いま次のような手順でやってるんですけどひらがなとかはわりとデコードできるんですけど・・・どこに問題がありますかね?あと今は&で区切る処理が無視してください。
1:GET/POSTの判別をする。/2:クエリーストリングや標準出力をよむ。/3:一文字ずつ次のように処理をする。
4:%が現れたら次の文字とさらに次の文字(それぞれ順にchar型変数A/Bとする。)
5:int jp = 0x10*A + B;
6:jpをchar型配列にぶち込んでいく。string[now] = printf("%c",jp);(nowには配列の現在の番号が入る。)
ご指摘お願いします。
0203fusianasan(20203/04/17 18:06ID:???
追加事項
{+は空白にする。
{%でも+でもなければそのままchar型配列にぶち込む
020419403/04/17 18:40ID:???
>>202

基本は問題ないと思われ。。
パッと見、気になるのは手順の5。
int jp でなく char jp の方が心臓に良いと個人的に思う。
#符号の問題ね。

あとは初歩的な・・・
4の処理が誤ってないこと、
char配列操作時のポインタ操作が「多少複雑」になってると思うので
ケアレスミスが無いことを確認汁。
0205fusianasan03/04/17 18:43ID:???
>>204
大変参考になる、返答ありがとうございました。
またがんばって試行錯誤してみます。
本当に有難うございますぃた。
0206fusianasan03/04/17 18:47ID:???
今思ったのですが>>202で
A;Bの処理で
swich(A) {
 case '0':
  A = 0x01;
 case '1':
  A = 0x02;
(中略)
 case 'f':
 case 'F':
  A = 0x0f
}
って漢字に16進にしなくてはいけませんよね?
0207fusianasan03/04/17 18:49ID:???
206です。
%のあとにつづく2文字をA,Bに代入したあとの処理を表しています。
ちょっとミスってるけど(セミコロンぬけ)
その辺は見逃してください。
ちなみにBに関しても同じ処理を行う。
020819403/04/17 18:49ID:???
見落としてた・・・

>ひらがなとかはわりとデコードできるんですけど・

デコードできる== 正しい文字で認識出来るってことだよね?
html含め処理内の文字コードの統一は出来てる??
0209nobodyさん03/04/17 18:50ID:???
>>200
何作っているのかしらんが、文字コードの統一処理なんて必要ないだろ。
0210nobodyさん03/04/17 18:59ID:???
判別不能なエンコーディングで送られてくるかもしれない。
021119403/04/17 19:00ID:???
>>207

break; も抜けてるが勘弁してやろう(w

その通り、16進だよ。
ちなみに漏れは、大文字のA〜Fを返すブラウザに出会ったことがないので
こんな感じ。
#余りいい見本では無いが・・

char *str;
char w;

if( *str < 0x41){
w = *str - 0x30;
}else{
w = (*str - 0x41) + 10;
}
0212fusianasan03/04/17 19:15ID:???
>>208
すべてシフトJISで送ってくれると思ってしていません。
(そこまで考える余裕がまだないからね・・・。)
HTMLはなるべくshift-jisで出力するようにメタタグに
記している。
>>211
ほんまや。break;が抜けちょる・・・・。
0213nobodyさん03/04/17 19:28ID:???
H&Sから引用。

>int toint(int c)
>{
>if (c >= '0' && c <= '9') return c-'0';
>if (c >= 'A' && c <= 'F') return c-'A'+10;
>if (c >= 'a' && c <= 'f') return c-'a'+10;
>return 0; /* other */
>}
0214nobodyさん03/04/17 19:50ID:???
昔書いたURLエンコードされた文字列をデコードする関数。

#include <stdlib.h>
char *url_decode(char *str)
{
char *p1=str,*p2=str,buf[3]={0};

for(;*p2;p1++){
switch(*p2){
case '%':
strncpy(buf,p2+1,2);
*p1=(char)strtol(buf,NULL,16);
p2+=3;
break;
case '+':
*p1=' ';
break;
default:
*p1=*p2;
p2++;
}
}
*p1='\0';

return str;
}


>>202
> string[now] = printf("%c",jp);
string[now]には1か負の数(おそらく-1)しか入らないけどいいの?
0215nobodyさん03/04/17 19:56ID:???
デコードに文字コードなんか関係あるのか?
0216bloom03/04/17 19:56ID:ahUYqmP+
http://www2.leverage.jp/start/
021721503/04/17 20:02ID:???
書き直そう。

デコードに文字コードが影響するのか?
0218bloom03/04/17 20:02ID:VKhj20RH
http://www2.leverage.jp/start/
0219fusianasan03/04/17 22:04ID:???
デコードテストをするために
今日ローカル鯖じゃなくてちゃんとしたUnix鯖で試したんすよ・・・。
じゃあローカル鯖でやったときよりイイ結果がでたんすよ。

やっぱりコンパイラによってちがうんですかね?
ローカル鯖ではLSI試食版つかってたんですけどね。
Borland c++だとファイルサイズが巨大になるからあんまり
好きじゃないんだな・・・。
0220nobodyさん03/04/17 22:29ID:???
最適化OFFの予感
0221nobodyさん03/04/17 22:52ID:???
>>220
最適化って速度とサイズでは全然違うと思うんだが。
0222fusianasan03/04/18 18:47ID:???
ようわからんけど、今日ようやくデコードプログラムが完成しました。
ちゃんとデコードできるようになりますた。
わーい!わーい!
0223nobodyさん03/04/18 18:48ID:???
>>222
もう少しCの標準関数について勉強した方がいいと思う。
0224nobodyさん03/04/18 20:42ID:???
>>223
標準関数でURLデコードできる時代なのな?
0225nobodyさん03/04/18 21:02ID:???
>>224
> 5:int jp = 0x10*A + B;

この変が阿呆らしいと言っているんだよ。strtolという関数があるだろ。
0226nobodyさん03/04/18 21:06ID:???
逆だが、↓これと同じこと。
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.1.6.html
0227nobodyさん03/04/18 23:45ID:???
226のurl、バッファオーバーフローの危機(ry
は置いといてマジレス・・

「車輪の再発明」だの「標準関数にある」だのってよく言われるけど
効率を追求する業務じゃなきゃ別にいいんじゃん?
確かに無駄な努力かもしれんけど、
初心(初学)者はそれによって大幅に理解が深まると思うし。

その気になれば、ほとんど全部自分で作れるのが
Cの長所でもあり短所でもあると思うよ。

逆に業務なら、『低レベル』まで自分で作れると
いざというとき強かったりする。
特殊な例かもしれんけど、一部組み込み系とか
ほとんど標準関数使えない様な環境もあるし。



自分で書いてて、屁理屈に見えてきた。
逝ってきます・・・
0228nobodyさん03/04/19 00:24ID:???
strtol,ulとか使うと、なんとなく仰々しい感じを受けるが…。
strtolだと、プラス/マイナス符号を突っ込まれても大丈夫?
たとえば、'%-E' とかあった場合。
それほど大きな問題にならないとは思うけど。。

また、URLデコードの後は0x80から0xFFが含まれる場合を考えて、
char型では無くunsigned char型の方がいいと思われ。
0229nobodyさん03/04/19 00:31ID:???
>>228
> たとえば、'%-E' とかあった場合。

そんな決まりにしたがわないデータはどうデコードされても文句は言えない。
023022803/04/19 00:31ID:???
strtolのエラートラップもしっかりとね。
変な文字食わせると0が返るから。
023122903/04/19 00:32ID:???
だってデコードのしようがないもの。
023222803/04/19 00:36ID:???
デコードのしようがなければ、エラーを返すものだと思うが。
変?

# お好きにどうぞ。
023323103/04/19 00:40ID:???
>>232
あんたがたまたま割り込む形で書き込んだだけで、別に>>230にレスしたわけじゃない。
>>229に補足しただけ。
0234nobodyさん03/04/19 06:05ID:???
>>232
例外とかが投げれるならより綺麗なんだけどね。
0235fusianasan03/04/19 15:13ID:???
動作すればどうでもいいやろ。
0236nobodyさん03/04/19 16:21ID:???
いい加減Cなんて捨ててC++にしろ。
0237nobodyさん03/04/19 16:30ID:???
Perlで書くときもデコードのエラー処理なんてしないような・・・・
0238nobodyさん03/04/19 16:32ID:???
>>237
フォーマットがおかしいときはそもそもマッチしないからエラーの起こる余地がない。
0239nobodyさん03/04/19 16:51ID:???
>>238
うん。だからエラー処理なんてしないよねと。
ゆえに>>232の言っていることはこれに関してはおかしいかも。
0240nobodyさん03/04/19 16:52ID:???
>>239
Cの場合はいくつかエラーとなる要因はある。バッファオーバーフローとかな。
0241fusianasan03/04/19 21:18ID:???
>>236:まだまだCの途中です。byF田K子
0242山崎渉03/04/20 05:58ID:???
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0243fusianasan03/04/20 17:37ID:???
__↓>>242
                         /    ̄ ̄ー―-_
         ▲               )           /
        /ハハハ\             |\|\|\___イ
.     /      \            | /\  /\lllll|
   /   _   _  \          | /・\ /・\ |
.   |   ⊂⊃ ⊂⊃  |          |   ̄/、  ̄ ̄  )
  (|    ∴  ∪ ∴ |             |    ̄     /
   \      <=>  /           ヽ  <三>  /
    \____/               ヽ    /
          ∧               /| \/
  ,r‐‐‐‐‐‐‐‐‐'´ `゙‐‐‐‐‐‐‐‐‐‐、r‐‐‐‐‐‐'´ `゙‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐、
 |  山崎君、きみはぬるぽしか言えないのかい|  そんなに卑怯者、卑怯者と |
 i  やっぱりきみは卑怯ものさ。      i  言わないでくれよ〜(泣    i
0244 03/04/21 11:55ID:???
つーか、適切なテストケース一覧を準備して自動でテストするプログラム作れよ。
0245nobodyさん03/04/23 19:47ID:jAUiG1DX
>>245

What does it mean?
0246nobodyさん03/04/23 20:22ID:???
>>245
再帰か。渋いな。
0247nobodyさん03/04/23 21:10ID:???
終了条件がないね。スタックオーバーフロウかしら。
0248nobodyさん03/04/26 01:53ID:???
perlばっかやってたからCがわかんねぇだ。
代入ひとつからしてもめんどくさくてしょうがない。
0249nobodyさん03/04/26 05:00ID:???
>>248
代入って文字列の代入のこと?
0250nobodyさん03/04/26 08:39ID:???
>>248
取りあえず文字列型かクラスのある言語使った方が幸せになれると思うよ。
0251ふしアナ:03/04/27 21:06ID:Cn2+e3lF
前友達にされた質問。
これってなんて読む?
(漏れの場合)
char ちゃー
argv あーぐぶい
printf ぷりんとふ
sprintf すぷりんとふ
hex へっくす
int いんと
getenv げっといーえぬぶい
void ぼいど
buffer ばっはー/ぶっふぁー
malloc まろっく

とりあえず今日はこのへんで・・・・
0252nobodyさん03/04/27 21:17ID:???
>>251
もう流石に飽きたな。読み方ネタ。
0253nobodyさん03/04/27 21:21ID:???
>>252
はげどう。
0254ふしアナ:03/05/03 23:37ID:4lYMudid
Cで作るときとC++で作るときどちらもメリット、デメリットが
あるとおもいますけど、それぞれの美点と欠点をあげてくれませんか?
0255nobodyさん03/05/03 23:38ID:???
>>254
C++:可変長文字列が美しく実装できる。
0256nobodyさん03/05/03 23:39ID:???
つーか標準ライブラリが提供しているじゃねーか。
0257FENT03/05/06 00:10ID:mpO79UQ6
質問!
UNCGIをWINDOWSで実行モジュール".exe"にコンパイルしたことある人
コンパイル方法おしえて。
英語のDocを読むとターボCがなんちゃらでわからん。
できれば、VC++とかでコンパイルしたいのねー。



0258FENT03/05/06 00:14ID:mpO79UQ6
>>254
WINDOWSで動かす場合だけど。
拡張子".cpp"で作成すればWINAPIをガシガシつかったCGIが出来るよ。
0259nobodyさん03/05/06 00:21ID:???
(ノ_-;)ハア…
0260nobodyさん03/05/06 00:47ID:???
めまいと頭痛が・・・
0261FENT03/05/06 01:04ID:mpO79UQ6
焼きなおすか・・・
UNCGIに変わるもので、おすすめのものしっているかた
いらしたら教えてください。
0262動画直リン03/05/06 01:10ID:qyy2Fj99
http://homepage.mac.com/hitomi18/
0263nobodyさん03/05/06 01:18ID:???
#define hex2dec(c) (((c) >= 'a' && (c) <= 'f') ? ((c) - 'a' + 10) : ((c) >= 'A' && (c) <= 'F') ? ((c) - 'A' + 10) : ((c) >= '0' && (c) <= '9') ? ((c) - '0') : (c))

char *Decode(char *str)
{
unsigned char *p, *bstr;

if(*str == '\0') return str;
bstr = (unsigned char*)str;
for(p=bstr; *bstr!='\0'; bstr++) {
if(*bstr=='+') {
*p=' ';
p++;
}
else if(*bstr=='%') {
*p = (hex2dec(*(bstr+1)) * 16)+(hex2dec(*(bstr+2)));
p++;
bstr+=2;
}
else {
*p = *bstr;
p++;
}
}
*p='\0';

return str;
}

何年か前に作ったデコード関数。
マクロの括弧が無駄に多い気が・・・
026426303/05/06 01:20ID:???
今改めて見ると、何て無駄の多いコードなんだ・・・
0265nobodyさん03/05/06 01:29ID:???
isxdigitとか知らないのか?
0266_03/05/06 01:35ID:???
 ( ・∀・)/< こんなのみつけたっち♪ 
http://www.japan.pinkserver.com/kensuke/hankaku/hankaku07.html
http://japan.pinkserver.com/kensuke/zenkaku/index.html
http://www.japan.pinkserver.com/kensuke/hankaku/hankaku08.html
http://japan.pinkserver.com/kensuke/hankaku/hankaku10.html
http://www.japan.pinkserver.com/kensuke/hankaku/hankaku07.html
http://japan.pinkserver.com/kensuke/hankaku/hankaku03.html
http://www.japan.pinkserver.com/kensuke/hankaku/hankaku05.html
http://japan.pinkserver.com/kensuke/hankaku/hankaku01.html
http://www.japan.pinkserver.com/kensuke/hankaku/hankaku06.html
http://japan.pinkserver.com/kensuke/hankaku/hankaku04.html
http://www.japan.pinkserver.com/kensuke/hankaku/hankaku09.html
026726103/05/06 02:05ID:mpO79UQ6
>>263
返信ありがとうございます。すみませんでした。
う〜ん
ヘキサのデコードというか、UNCGIを使いたかったのは、
HTTPのリクエストから切分けてデコードした後に、
環境変数にセットしている、仕組みをそのまま使いたいなーって思って
たんですよ。

UNCGIの処理の流れ的には
・環境変数取得
・切離し後デコード
・それぞれ別の環境変数にセット
・URLの引数(ttp://***/uncgi/aaa.exe)のプログラム(aaa.exe)を起動
・起動されたプログラムは、環境変数よりPOST及びGETの
 パラメータを取得

こんな感じだとおもうんですよ。作ればいいんですけど・・・

ただ、コンパイルできたらいいなーと思いまして。
VC++だと、何ヶ所かコンパイルにひっかかってしまうので
私のめんどくさがりやから・・・質問してしまいました。
026826103/05/06 02:08ID:mpO79UQ6
>>267 追加
ただ・・この仕組みをつくるとしたら疑問があるんです。
HTTPのリクエストで起動されたCGIによってセットされる環境変数は、
ブラウザごとに別々の扱い(DOSプロンプトのように)になるのでしょうか?
同時にアクセスがあった場合、同一名称の環境変数は、それぞれブラウザ
ごとに違う値を保持するのかな???
0269nobodyさん03/05/06 03:04ID:CpGJxcjL
自分でデコードしてたけど、画像アップロードとかあるんで
結局cgiccに移行したよ。cgiccおすすめ。
0270bloom03/05/06 03:10ID:qyy2Fj99
http://homepage.mac.com/ayaya16/
0271_03/05/06 03:25ID:???
 ( ・∀・)/< こんなのみつけたっち♪ 
http://www.japan.pinkserver.com/kaorin/moe/jaz04.html
http://japan.pinkserver.com/kaorin/mona/index.html
http://www.japan.pinkserver.com/kaorin/moe/jaz05.html
http://japan.pinkserver.com/kaorin/moe/jaz08.html
http://www.japan.pinkserver.com/kaorin/moe/jaz09.html
http://japan.pinkserver.com/kaorin/moe/jaz02.html
http://www.japan.pinkserver.com/kaorin/moe/jaz06.html
http://japan.pinkserver.com/kaorin/moe/jaz01.html
http://www.japan.pinkserver.com/kaorin/moe/jaz10.html
http://japan.pinkserver.com/kaorin/moe/jaz07.html
http://www.japan.pinkserver.com/kaorin/moe/jaz03.html
0272_03/05/06 04:07ID:???
   川o・-・)ノ <先生!こんなのがありました!
http://www.japan.pinkserver.com/kaorin/moe/jaz03.html
http://japan.pinkserver.com/kaorin/mona/index.html
http://www.japan.pinkserver.com/kaorin/moe/jaz02.html
http://japan.pinkserver.com/kaorin/moe/jaz08.html
http://www.japan.pinkserver.com/kaorin/moe/jaz09.html
http://japan.pinkserver.com/kaorin/moe/jaz05.html
http://www.japan.pinkserver.com/kaorin/moe/jaz06.html
http://japan.pinkserver.com/kaorin/moe/jaz01.html
http://www.japan.pinkserver.com/kaorin/moe/jaz10.html
http://japan.pinkserver.com/kaorin/moe/jaz07.html
http://www.japan.pinkserver.com/kaorin/moe/jaz04.html
0273nobodyさん03/05/06 07:50ID:???
>>267
誰 も お 前 に は 返 信 し て い な い よ
0274nobodyさん03/05/07 00:56ID:ZdGvFTnv
>>273
↑朝早くから
 誰 オ マ イ

■ このスレッドは過去ログ倉庫に格納されています