アプリ版:「スタンプのみでお礼する」機能のリリースについて

環境(開発用)
 OS:Window2003
 webサーバ:IIS6.0
 ブラウザ:IE8
 cgiアプリ:Microsoft Visual c++ 6.0


ある画面(テーブル形式の表)よりボタンをクリックするとcgiアプリで処理を行う機能があります。

テーブルの1行内にpostメソッドが8個有り、ボタンごとに必要なPOSTデータを取得して
処理を行うような仕様です。


で、試験をしていくうちに、
テーブル行が200行を越えた場合、
cgiアプリ側で、データベースのオープンすらエラーになってしまいました。

その時のエラーメッセージは
   could not connect to server: No buffer space available (0x00002747/10055)
です。



テーブル行が150行の場合は、正常に処理できます。

(アバウトに、150行で試験したらOKで、200行で試験したらNGだったという事です)



原因を調べていくうちに、
POSTメソッドには制限がある(128Kまで?)とのサイトを見つけました。

制限は無い...とのサイトもありましたが、試しに
各行同じだけあったPOSTメソッド数を
処理ごとに1行内で必要なPOSTメソッドだけにしてみたところ、
200件を越えても、正常に処理ができました。


これって、つまりはブラウザに制限があるということになるでしょうか?

また、この制限を大きくすることはできるのでしょうか?


phpですと、MAX値を変更できる・・・ような事も書かれてあるサイトも見つかったのですが

IE8、C++ の場合、設定変更できるのでしょうか?








         

A 回答 (7件)

No.2,4,5,6です。



> 因みにnameの数もそうですが、当然渡すデータサイズも関係しますよね?
> max、20byteのパラメータが3個は・・・全行にあり、ここも不要な場合、削除しました。これは大きいですよね?(^^;

もちろん渡すデータサイズがPOSTのサイズに関わってきますが、
max20バイトだったら、200行×8チェックボックス×20バイト=32Kバイト
程度のものですよ。POSTデータとしてはたいしたことないサイズだと思います。
(画像のアップロードにもPOSTを使いますが、そんなのは数メガ行く場合もあります)

追加の観点としては、そのCGIのパラメータ解析処理に問題がないかも
見た方がよいと思います。もしかして32Kの固定バッファを使って
POSTデータを読み込んでいて、32Kバイト以上のPOSTデータを受信すると
バッファオーバーフローでメモリ破壊してしまい、DBオープン処理や
GetPrivateProfileStringが正常に実行できなくなっているという可能性は
ないでしょうか?ということです。

この回答への補足

その後、、、別問題が発生し、
##onloadのタイミングについて、
##別Qをたてているのですが、
##マッチする回答が付きませんでした。
##が、そこで問題が見つかってしまいました! 
未だにパケットキャプチャできていません。
結果を報告してからと思ったのですが、
時間がかかりそうなので、ベストアンサーにさせていただきます。
有難うございました。

補足日時:2014/01/29 17:15
    • good
    • 0
この回答へのお礼

Lchan0211b さん、引き続き有難うございます。

cgiクラスのソースを見ましたところ、
POST用のバッファはGlobalAlloc()で確保していました。
内部的な話かもしれませんが、フィールド数も36864とっていました。

今週中にはwiresharkで確認できるかもしれません。

お礼日時:2014/01/20 11:31

No.2,4,5です。



> 例えばcheckBoxの場合、チェックされている項目だけPOSTデータが渡るのですよね?
> 実際には、checkboxにチェックをしないでボタンクリックして同じ現象になっていました。

はい。checkboxにチェックのない項目はPOSTデータで送信されません。

ただ、あなたの説明には
> で、今までは □更新 の行だとしても 全て(見る聞く・・・)の情報を表示していました。
> 情報が無い場合はhidden項目にして。
> で、今回、「更新」の行に「見る」「聞く」などの情報は不要のため
> hiddenで表示している項目を全て削除してみました。
と書かれてあり、「hidden項目にした」というのは、inputタグのtype属性を
"checkbox"から"hidden"にしたのだろうと思いました。

例えば
<input type="checkbox" name="miru" />
の部分を
更新の行については
<input type="hidden" name="miru" />
としたのだと思いました。
そして、これだとトラブルが発生し、このinputタグ自体を
削除したらトラブルが発生しなくなったのだと理解しました。

<input type="hidden" name="miru" value="" />
の場合、miruパラメータは送信されないのではなく、
「miru=」(空白値のmiruパラメータ)が送信されます。

いずれにしても、パケットキャプチャで実際に送信されたPOSTデータを
確認すれば、このあたりの疑問もはっきりすると思います。
    • good
    • 0
この回答へのお礼

Lchan0211b さん、重ね重ね有難うございます。

ソースの状況、及び変更内容はLchan0211bさんの説明通りです。



#<input type="hidden" name="miru" value="" />
#の場合、miruパラメータは送信されないのではなく、
#「miru=」(空白値のmiruパラメータ)が送信されます。

理解しております。
でも、チェックボックスはチェックをしない場合、そのグループ?!のnameは送信されないですよね?
(修正後に送信されないことも確認できました)

なのに、結果として削除しないとダメだったんですね。
他のパラメータの数が多すぎたんですかね。。。

今回はmaxでいうと、300行程度になる場合があるかもしれない仕様のようなので
とりあえず、今のままでいけそうですが
今後はそうも行かないかもしれませんので、解決しないまでもちゃんと把握しておきたいと思います。


サイズの制限があるとしたら、
因みにnameの数もそうですが、当然渡すデータサイズも関係しますよね?
max、20byteのパラメータが3個は・・・全行にあり、ここも不要な場合、削除しました。これは大きいですよね?(^^;



まだまだですが、いろいろと勉強になりました。

WireSharkの出番ですね。
まだちゃんと使ったことが無いので勉強しながらやってみます。
ありがとうございました。

お礼日時:2014/01/17 16:58

No.2,4です。



追加説明ありがとうございます。

追加説明より、postメソッドが8個あるんじゃなくて、
テーブルの各行にチェックボックスが8個ずつあり、
ボタンはその画面に全部で(A,B,Cの)3個しかなく、
1回ボタンを押すとそれに対応するpostメソッドが
1回実行されると理解しました。

これ以上は実際にそのWebシステムを見ないと
どこが悪いのかはわからないですが、なんとなく、
「更新」の行に「見る」「聞く」等の不要なパラメータが
hiddenで入っているため、そのパラメータ情報が
CGIに渡されて誤動作したんじゃないかなという感じが
しました(あくまで少ない情報からの勝手な想像です)。

いずれにしても、POSTメソッドのサイズ制限を疑うなら、
パケットキャプチャソフト等を使って、実際にブラウザから
どのようなPOSTデータが出ているか調べて、CGIの入り口で
POSTデータをログ出力する等して、ブラウザから送信した
POSTデータを全て受け取ったかどうかを調べれば
はっきりすると思います。

ちなみに、POSTデータサイズ制限値ですが、
http://support.microsoft.com/kb/327659/ja
に書かれてある204,800 バイトの制限は、
ASPの話なので、CGIを使っている人は関係ないです。

それ以外では、IIS4,IIS5について
https://support.microsoft.com/kb/260694/ja
にある通り、MaxClientRequestBufferの設定があり、
IIS5ではこれが128KB制限でしたが、IIS6でもこの設定が
有効かどうかはよくわかりません。たぶん、IIS6では
そういう制限はなくなったはずだと思います。
    • good
    • 0
この回答へのお礼

Lchan0211b さん、ありがとうございます。

例えばcheckBoxの場合、チェックされている項目だけPOSTデータが渡るのですよね?
実際には、checkboxにチェックをしないでボタンクリックして同じ現象になっていました。
(ちょっと話がずれていましたらお許しください)

最初、JavaScriptで、ひとつ以上checkされているか確認し、ひとつも無い場合はalert表示していたのですが、
行数が多いとかなり負荷がかかるのでcheckboxにcheckがなくてもcgiアプリに渡るようにしてしまいました。


やっぱりパケットキャプチャソフトで確認したほうがいいですね。

開発環境はIIS6.0ですが、商用は7.xの最新だそうです。
(今、聞きました(^^))


とりあえず、今は動いているので
(納品後に爆弾にならないことを祈っています)
今すぐキャプチャすることはできないのですが、
今まであまりパケットキャプチャで確認したことが無いので、必ず確認したいと思います。

有難うございました。

お礼日時:2014/01/17 11:46

No.2です。



PQerrorMessageでエラーメッセージを取得したのなら、
PostgreSQLがDBオープン処理でエラーを検出したということですよね。
私だったら、数が多くなるとエラーになるということは、
そのDBオープンに対するクローズ処理がちゃんと行われているかを
疑います。

PostgreSQLを扱うコーディングはしたことはないのですが、
http://www.postgresql.jp/document/8.1/html/libpq …
によると、PQconnectdbに対してPQfinishを発行することで
接続を閉じるようですが、ちゃんとPQfinishが正しいパラメータで
発行されていることは確認しているのでしょうか?
特に今回のケースは、GetPrivateProfileStringで取得した値が
nullになるというバグを内在したままの動作ですので、もしかすると
スタック破壊等、なんらかのメモリ破壊を起こしたまま動作していて、
一見正しくPQfinishを発行したように見えていて、実はその発行パラメータ
の中身が破壊された状態でPQfinishを呼び出していて、PQfinishがエラーに
なっている(クローズできてない)可能性もあるのではないかと思いました。
PQfinish自体に戻り値はないようですが、その結果はPQstatus関数で
確認できるようです。確認してなければ、そこはちゃんと確認した方が
よいと思います。

そもそも、最初の状況説明がよくわかってないのですが、
「テーブルの1行内にpostメソッドが8個ある」というのは、
テーブルの1行内にpostメソッドを発行するボタンが8個あって、
1回のボタンクリックに対して1回のpostメソッドが実行されると
いうことでしょうか?
それとも、テーブルの1行にボタン1個で、javascript等で
制御して1回のボタンクリックに対して8回のpostメソッドが
実行されるいうことでしょうか?

後者であれば、1クリックで処理するpostメソッドの数が関係する
のはわかりますが、前者であれば、1クリックで処理するpostメソッドは
1つなので、postメソッドの数は一見関係ないように思えます。
前者の構造なのに、それでも説明されているような状況が起きているので
あれば、postメソッドの処理の問題ではなく、その前のテーブル
出力処理(200行のテーブルの各行に8個のpostメソッドボタンを
配置するHTMLデータ出力処理)時に、メモリ破壊等なんらかの問題があって、
後続のpostメソッド処理に影響を与えているのかもしれないなと思いました。

質問を継続するようであれば、postメソッドとボタンクリックの関係も
補足してください。
    • good
    • 0
この回答へのお礼

Lchan0211b さん、ありがとうございます。

事前のDBオープンに対するクローズ処理はちゃんと行われていますが、
PQstatus関数で確認はしていないので、やってみます。

ただ、他の処理では問題なく普通に処理できています。
問題は、件数が多いときだけ・・・発生しているのです。

件数が多くても、postデータを取得しないボタン処理は当然
正常に動きます。



###「テーブルの1行内にpostメソッドが8個ある」というのは、


すみません、言葉足らずでした。

1行内に、postで渡せる情報(id)やチェックボックスがたくさんあります。
言葉を変更させて書かせていただきますが、テーブルの各セルに、

id1=xxx id2=xxx id3=xxx □見る □聞く □送る □受け取る □終わる...

等があります。

で、tableの外に複数のボタンがあり、
・「見る」と「聞く」の処理を行うボタン (以後、Aボタン)
・「送る」と「受け取る」の処理を行うボタン(以後、Bボタン)
・「終わる」の処理を行うボタン(以後、Cボタン)
等があり、

Aボタンをクリックした場合、hidden項目に処理種別などをセットして、
submitしています。で、exeが動き、
チェックされている情報を受け取り、別プロセスに「見る要求」か
「聞く」要求を出すだけの処理を行います。



Bボタンも同じです。

Cボタンは、id1、id2、id3の情報とともに別プロセスに「終わる要求」を出すだけの処理を行います。

処理的には単純な処理です。
別プロセスに渡す方法は
POSTデータをパラメータ渡しでCreateProsessを実行しています。


実際には、1行内の意味として上記の情報(checkbox)がない行も有り、
その行には別セルに □更新 のようなpost
があります。

で、今までは □更新 の行だとしても 全て(見る聞く・・・)の情報を表示していました。
情報が無い場合はhidden項目にして。

で、今回、「更新」の行に「見る」「聞く」などの情報は不要のため
hiddenで表示している項目を全て削除してみました。
逆に、「見る」などの情報がある行は「更新」は不要なので削除しました。

そうしたところ、
200件でもうまく処理ができたのです。



何故GetPrivate・・・が正しく処理できないのか、
未だに原因不明です。

引き続きまして、よろしくお願いいたします。

お礼日時:2014/01/15 11:30

>ould not connect to server: No buffer space available



メモリ不足(というよりもメモリの使い過ぎ)ではないでしょうか。
一時ファイルに保存して、1行ずつ処理してみてはいかがでしょうか。


-------------
POSTサイズ制限はデフォルトで204,800バイト、それを越えた場合は403 HTTP ステータスコードが返るようです。
POSTサイズの変更はIISの設定で変更できます。
http://support.microsoft.com/kb/327659/ja

HTTPとして制限はないはずですが、
サーバーやクライアントのメモリ、ストレージ容量や、ネットワーク(タイムアウトなど)、人為的(長時間待ち続けられるか)の制限を受けます。
http://support.microsoft.com/kb/181050/ja
    • good
    • 0
この回答へのお礼

taloo さん、ありがとうございます。

メモリの使いすぎ・・・なんとなくわかります。
当然、もう少し少ないtable行の場合でも、ボタンクリックした途端、処理が遅くなりますし。


1行ずつ一時フアイルに保存して・・・だとかなりの改造になります。
次期更改時には検討したいと思います。


403 HTTP ステータスコードがでるタイミングっていつなんでしょう???
今回は表示されません。

cgiアプリに渡る前に
POSTサイズ制限を超えたと判断されれば403表示になるのでしょうか?

今回は表示されないでcgiアプリに一応渡っていますので、、、
???

POSTサイズ制限の変更、ありがとうございました。
変更できるかどうかわかりませんが、
サーバ管理者に伝えたいと思います。

有難うございました。
引き続きよろしくお願いいたします。

お礼日時:2014/01/15 11:37

「could not connect to server」ですか?


「could not send data to server」なら、
メッセージ内容が全く同じ事例がありますけど。
(参考)
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …

もし、そのメッセージの直前に「psql:」と書かれているなら、
いずれにしてもPostgreSQLデータベースサーバーが出力したもの
だと思います。
というか「cgiアプリ側で、データベースのオープンすらエラー
になってしまいました。」と書かれているということは、
データベースサーバが出力したエラーメッセージだということは
わかっているのですよね?
であれば、CGIがデータベースにどのような要求をしていて、どの要求に
対してそのエラーメッセージが出ているのかを調べればよいのでは
ないでしょうか?

それなのに、POSTメソッドのサイズ制限やブラウザの制限を気にして
いる理由がさっぱりわかりませんでした。
Webサーバのバッファサイズの問題ではなく、CGIのデータベース
アクセス処理の問題のような気がします。
    • good
    • 0
この回答へのお礼

Lchan0211b 様、ありがとうございます。

当然参考のURLは見ました。
が、ファイルのuploadでは無いし、phpでは無いし、
データベースをアクセスする前の話しだし・・・で、却下(!)しました。^^;


最初はデータベースを疑ったのですが
現象が発生するその処理はデータベースをアクセスしないのです。
ただ、CGIアプリの作りで、先頭でDBopen、最後にDBcloseをするようになっているだけなのです。

ソースを見る(その部分は自作ではありませんので)と、
CGIアプリの先頭で行うDBオープンで失敗していました。
PQconnectdb( xxx )がCONNECTION_OKにならなくて該当エラーになっていました。

エラーメッセージは PQerrorMessageで取得したものです。
psql:の文字はありませんでした。


ログにより、PQconnectdb()に渡すIDやパスワードが環境フアイルより取得できてなくて、全てnullでopenしていました。
INIフアイルより、GetPrivateProfileString関数で取得しているだけなので、、、このような現象は初めてでした。

環境ファイルが読み込めないなんて・・・
原因がよくわからないけれど、とりあえず固定で設定してみようと思い、
ハードコーディングでID,passwprdなどを渡すようにしたのですが、それでも結果は同じく
could not connect to server: No buffer space available (0x00002747/10055)
でした。(かなり焦りました!)

(0x00002747/10055)・・・を調べてみたところ、windowsが出すメモリリークエラーのようなので、直接はエラーメッセージに結びつかなかったのですが、
cgiのほうを疑ったのです。
150ではうまくいくのに、200ではNGでしたし。

150と200の大きな違いはテーブルの行数、つまりPOSTの数?サイズ? と考えまして、試しに、POSTメソッドの数を減らしたら、結果としまして200でも正常に動作できたのです。400でも動作できました!(^^)

ログに出力されたエラーメッセージの内容と直接結びつかないのですが、とりあえずうまく動くようになりましたので
質問させていただきました。

その後の調べで
POSTでは送信サイズに制限は無い、
但し、受信側では制限があるとの情報も見つけました。


受信する側のサーバの設定で回避できるのであればと思い、
あわせて質問させていただきました。

以上、よろしくお願いします。

お礼日時:2014/01/09 11:59

>POSTメソッドには制限がある(128Kまで?)とのサイトを見つけました。


 それは、GETの場合です。
 ⇒入力フォーム編(GETとPOSTデータを受け取るには) - futomi's CGI Cafe( http://www.futomi.com/lecture/form/ )
 POSTで受け取れるデータサイズは、使用しているHTTPサーバーの設定です。

IISは、マイナーなので知りませんがapacheでしたらLimitRequestBodyで制限します。
 ⇒core - Apache HTTP サーバ( http://httpd.apache.org/docs/2.0/mod/core.html#L … )
    • good
    • 0
この回答へのお礼

ORUKA1951 様、ありがとうございます。

GETの制限があるのは調べました。
同時にPOSTにも制限があるとの記載があったのですが、
これは間違いなのかもしれません。

apacheのHTTPサーバの設定方法は調べられました。
でもIISなのです。

引き続きよろしくお願いいたします。

お礼日時:2014/01/08 15:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!