ソケット利用、途中で中止が押された場合の処理

このQ&Aのポイント
  • ソケット利用時に途中で中止が押された場合の処理方法について悩んでいます。一定間隔でデータを取得するためのリクエストが中止された場合、どうすれば良いのかわかりません。
  • ソケットを通じて別のサーバーのデータを加工し、CGI経由で表示しています。しかし、データを取得する際に途中でリクエストが中止された場合の処理方法について悩んでいます。
  • 現在、ソケットを使用して別のサーバーからデータを取得し、一定間隔でデータを更新しています。しかし、リクエストが途中で中止された場合の処理方法についてわかりません。どのように対応すれば良いでしょうか?
回答を見る
  • ベストアンサー

ソケット利用、途中で中止が押された場合の処理

現在ソケットを使って別なサーバーにあるデータを加工してCGI経由でデータを見せようとしているのですが、毎回データを取りに行っていると効率が悪いので、一定間隔のリクエスト毎にデータを取得に行くようにしようと思っているのですが、そのデータ取得するタイミングのときのリクエストが途中で中止された場合の処理をどうすれば良いのか悩んでいます。cronが使えると良いのですが、残念ながら使えません。手動で更新するのも手間からして無理なので、閲覧者のリクエストを利用するしかありません。 $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "hogehoge"; としてhogehogeに処理を書けば良いようなのですが、実用的なサンプルが見つけられなかったので、完全に理解できていません。どこかに良いサンプルはないでしょうか?

  • keiso
  • お礼率100% (1/1)
  • CGI
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • oodaiko
  • ベストアンサー率67% (126/186)
回答No.1

>一定間隔のリクエスト毎にデータを取得に行くようにしようと思っているのですが、 >そのデータ取得するタイミングのときのリクエストが途中で中止された場合の処理を >どうすれば良いのか悩んでいます。 そのようなことをやりたいのであれば http://www.bio.rcast.u-tokyo.ac.jp/~taro/tips.html#background3 のサンプルスクリプトがほとんどそのまま使えると思います。 そういう作業用のスクリプトを組むのなら、このページの他の記事もいろいろと参考になると思います。 (例えば 「CGI のタイムアウトおよびブラウザの中断」の際に、サーバーやGCIスクリプトやブラウザがどのような対応をするのか、ということは、私も今までもなんとなく理解していただけなので、ここで初めて知りました。(^^;) ただしこのサンプルを単純に応用すると、ユーザーがブラウザを終了させても、子プロセスに飛ばした処理(keisoさんの例で言えば、他のサーバーからデータを取得して加工する処理)が終了するまで子プロセスは終了しません。そこで子プロセス側で下手な処理をして止まらなくなったりすると、いつまでもサーバー側にプロセスが残っていることになってしまいます。 自前のサーバーならまだしも、レンタルHPスペースでそんなことになると他のユーザーの迷惑になるし、あまりそういうことをやっていると追い出されてしまう恐れがありますのでご注意下さい。 子プロセス側でもサンプルと同様にalarm機能を使って、一定の時間が経過したら自分自身を終了させるようにしておくと良いと思います。

keiso
質問者

お礼

非常に参考になる情報をご紹介頂き ありがとうございます。 子プロセスに処理を飛ばすと言う事は 考えていなかったので、その手も有るな と思いましたが、その辺の処理を うまく出来るかちょっと不安なので、 ブラウザで中断された場合には、処理を中断して 次のリクエストの時に最初から処理を行う方向で 作ろうと思います。 時間が有れば、子プロセスに処理を飛ばす形も 作って自宅サーバーで実験してみます。

関連するQ&A

  • C++での24bit符号付き整数値の処理

    現在wavファイルからデータを読み出し、少数倍して再び格納するプログラムを作成しています。 量子化ビット数が16,32bitの場合は読み出したデータをshort型,int型の変数に入れて、そのまま計算が出来るのですが、C++には24bitの変数型がないため、24bitデータの処理に苦戦しています。 1サンプルあたり24bitで格納されているデータを読み出し、(double)倍したのち再び24bitずつ(3byte間隔で)書き込むにはどのようにすれば良いでしょうか? 一度int型に格納し、計算してから上位3byteを書き込む方法が簡単だとは思うのですが、負の値の扱いに困っています。 どなたかサンプルプログラムをお教えいただけると幸いです。

  • PHPで一時停止しながら最後まで処理を到達させたい

    エックスサーバーでPHP・MySQL・cron機能を利用して 以下のような挙動をさせたい、と考えています。 ********** 1.cronで5分おきに、前回処理から100分経っているかどうかチェック 2.経っていたら、処理に必要なデータをDBから取得し、配列に格納(これ以降、DB接続はしない) 3.取得したデータを元に、ループで処理を回す 4.3の処理が5回行われたら一時停止(sleepを使用) 5.8分経ったら処理を再開 6.3~5の処理を8回行ったら処理終了 ********** しかし、現状では2~3回まではログが出力されるのですが、 それ以降のログが一切出ておらず、途中で処理が強制終了されてしまったのではないかと 思っています(エラーログ等も確認しましたが、何も出力されていませんでした)。 なんとか最後まで処理を到達させたいのですが、 強制終了の回避方法がまったく検討がつきません。 cronで8分おきに処理を行わせる、ということも考えたのですが 100分おきに処理を開始し、その上で8分おきにcron設定をする、という方法が 皆目見当がつきませんでした。 まったくの無知で申し訳ないのですが、 何かお知恵を貸していただけないでしょうか。

    • ベストアンサー
    • PHP
  • 処理実行について

    MySQLでの データの構造の中のtimeに日付と時間が書かれていて その時刻にその日付と時間が一致した行を処理に通したいのですが 処理間隔は10分毎です。 PHPでできるでしょうか? 他のスクリプト言語でもかまいません。 メール送信を予約送信したい為です。 (10分間に1万通の送信になると思います。) できなければ 1時間に1回のCRONジョブにします。 返答宜しくお願いします。

    • ベストアンサー
    • PHP
  • タイムアウト時ソケット通信を中断して次の処理を実行したい

    だいぶはしょってありますが、大雑把な流れは下のようなサブルーチンです。 タイムアウト時エラーメッセージに飛んでしまうと、その後の&kaiseki_beta;が実行されません。 タイムアウト時にソケット通信を中断して、その後の処理を実行させたいのですが、方法がわかりません。 $SIG{'ALRM'} = \&closeSocket(SOCK);とかやってみたのですが、500エラーになってしまい困っています。 何か良い方法があったら教えてください。 sub autobeta { $SIG{'ALRM'} = \&TimeoutError; eval { alarm 10; }; if (&openSocket(SOCK, $url, $method, \%header, $stdin)) { $vieweron = 0; open(DATA,">$betafile"); while(<SOCK>) { if ($vieweron == 1) { print DATA $_; } if ($vieweron == 2) { $vieweron = 1; } if ($_ =~ /Content-Type/i) { $vieweron = 2; } } close(DATA); &closeSocket(SOCK); } else { &error; } eval { alarm 0; }; &kaiseki_beta; return($beta); }

  • シェルスクリプトでのエラー時の処理について

    HTMLにシェルスクリプトを実行するSSIを埋め込んで、 その実行結果をHTML側に出力する、という処理をしようとしております。 大まかな処理内容は、指定の場所のファイルの有無をチェックして それにより"ok"か"ng"かの文字列をHTMLに出力する、というものです。 ====以下、HTMLソース(前後省略)==== <br> 結果は:<!--#exec cmd="./output.sh" --> <br> ====ここまで==== ====以下、シェルスクリプトソース==== #!/bin/sh CHECKFILE=/aaa/bbb/check.txt TEXTA=ok TEXTB=ng if [ -f $CHECKFILE ] ; then echo $TEXTA else echo $TEXTB fi exit ====ここまで==== この処理自体は特に問題無さそうなのですが、 この中に途中で異常終了した際のエラー処理を組み込むことによって、 異常時には固定で"ok"を出力して終了するようにしたいのです。 trap "echo 'ok'; exit" HUP INT QUIT KILL TERM や trap "echo 'ok'; exit" 1 2 3 9 15 などのtrapを入れたりもしたのですが、 思い通りには動かず、結果を返すことなく終了してしまいます。 このような場合、trapに限らず何か良い方法はありますでしょうか。 何かご存知の方おりましたらご助言頂けますでしょうか。。 よろしくお願いいたします。

  • リクエストした処理がタイムアウトしました。

    これはいったい何なのだ? 昨日からスマホでネットをしていると上記の「リクエストした処理がタイムアウトしました。」という小窓が開いて来てうざいです。 閉じるボタンをクリックすれば消えますが、20分~30分間隔で立ち上がって来るので困っています。 更に今日は、自宅のデスクトップでも同じ「リクエストした処理がタイムアウトしました。」が出現したのでびっくりです。 スマホもPCもセキュリティー対策はちゃんとしているし、何故突然何の繋がりも無いスマホとPCに同じ自称が発生するようになったのか、何方か原因や対策をご存知の方がいらっしゃりましたらアドバイスをお願いいたします。 スマホもPCも再起動させても自称は治まりません。 ※、シャープ003PとウインXP。 ※、スマホとPC間の接続やデーターの交換などは一切していません。 だいたい何もリクエストなんぞした憶えは無いのに「リクエストした処理がタイムアウトしました。」って、いったい何のことなのでしょうか?

  • Active reportの処理に関して

    現在、Visual Studio2008で、C#とActive report、 MySQLを用いて帳票を作成しようとしています。 Active reportのサンプルに記述してあるバウンド処理や、アンバウンド処理 でMySQLから取得した情報を直接帳票に出力する事はできるようになりました。 但し、一般的なイメージとしては、印刷ボタンが押された段階で、画面上からの検索条件 を取得し、それをベースにDBへ検索しにいった結果をデータセットへ格納し、それを 帳票で使用して出力するようなイメージがありました。。。 そもそもその考え方が間違っているのでしょうか??? 私の知識不足ではあるかとは思いますが、上記のバウンド処理やアンバウンド処理では、 画面からの条件での検索がうまくいきません。 どういう形で出力するのが一般的なのでしょうか??? また、そのサンプル的なものも教えて頂ければ幸いです。 よろしくお願いします。

  • 重複した数値の処理について

    実験で測定したデータの処理で困っています。 初めて質問させて頂きます。 取得したデータが重複しています。重複した箇所を適切に処理したいです。 各行の項目は次の通りです。 行A:時間 行B:分 行C:S 行D:HRV HRVとは心臓が鼓動する時の間隔時間(ms)です。(1回目のドックン!から2回目のドックン!までの時間) 間隔時間を測定しているため、一つの値(間隔時間)が2つの秒(S)をまたいで記録される場合もあります。つまり、同じ値が連続して記録されてしまっています。 2つ連続している値は一つに、3つ連続している値は2つに、というように処理したいです。 やはりマクロを用意するのでしょうか? もし良い方法があれば、この問題を修正したいです。 よろしくお願い致します。 *画像のデータは重複の削除を行い、データを見やすく編集しています。

  • データ未入力時のエラー処理がうまくできません・・・

    現在、JSPファイルを作成しています。その内容は、HTMLで表示されたテキストボックスにデータを入力し、 次のページでそのデータを表示させるものです。 データが未処理の場合のJavaのプログラムは、以下のようになります。 if(txtInpA == "") { データが未入力時のエラー処理 }else{ データが入っているときの処理   } *「txtInpA」にデータが入っています。 しかし、このプログラムだと正常に処理してくれません。 「""」の代わりに「null」としても同じです。 また、データを取得するメソッド「request.getParameter()」を使っても 同様にうまく処理をしてくれません。 なにかよい方法があればぜひ教えてください。お願い致します。

    • ベストアンサー
    • Java
  • 例外処理(throws Exception)について

    Javaでインスタンスを作るときの例外処理を学んでいます。 ageクラス(属性は、private int ageのみ)のt1オブジェクトを作るときに、年齢が0歳以上100歳以下ならt1が作られ、それ以外の場合はエラーを返すようにしたいと思いますが、うまくいきません。 そのため、仮に50歳でオブジェクトを作ってから、年齢を150にした場合を考えましたが、Sample クラスのt1.setAge(150);のところで、「処理されない例外の形」というエラーが返っております。 改善点につきまして、ご教示いただければ幸いです。 ■■ageクラス■■ package ex1; public class age { //***属性***// private int age; //***コンストラクタ***// public age(int data){ this.age= data; } //**メソッド**// public int getAge(){ return age; } public void setAge(int age)throws Exception{ //**年齢が0から100までかどうか**/ if((age > 0) && (age <100)){ this.age = age; } else{ throw new Exception("無効です"); } } } ■■Sample クラス■■ package ex1; public class Sample { public static void main(String[] args) { age t1; t1 = new age(50); t1.setAge(150); System.out.println("t1_age="+ t1.getAge()); } }