2011-10-22 20 views
5

タイムアウトをインテリジェントにサポートする必要があるデータベースライブラリを作成しています。今私は、接続プールで探しています、私は次のシナリオについて特に心配していること:TCPソケットの応答が遅くなるのを防ぐにはどうすればよいですか?

  1. N秒後にクエリ#1
  2. 時間を送り出します。
  3. #1
クエリは、クエリIDでマークされていないため、

ステップ4は、発生する可能性がクエリに対する応答を受信クエリ#2

  • を送信:私が知っているすべては、私が応答を受け取ったですそれがどのクエリーに属しているのかわかりません。これは議定書の間違いを構成すると主張するかもしれませんが、それは私の責任ではありません。

    質問#2を送信する前に、このような遅い応答を避けるためにソケットに何をする必要がありますか? shutdown()close()、およびconnect()への唯一の正しい方法はありますか?

  • +2

    何あなたのライブラリーは、応答が用されるクエリを識別できるよう、すべてのクエリの選択に一定の追加について? – T3hc13h

    +0

    それは素晴らしい考えですが、悲しいことに、ライブラリにとってはあまり良くありません。多分プラグインを介して... –

    答えて

    3

    これは、TCPでの質問と回答の間に1対1を得る他の方法がないため、接続を操作する唯一の安全な方法です。何らかの種類の不足があると思われるの機能を無効にします。

    このリファレンスでは、より多くの洞察力を与える:http://www.ssfnet.org/Exchange/tcp/tcpTutorialNotes.html

    +0

    これは、TCPがいわゆる "クエリ"、 "レスポンス"、または "キャンセル"のどれも知っていないからです。接続されたソケットは、バイト用の単方向の2本のチューブです(Ted Stevensが正しいと思います)。もし誰かが書き込みを終え、クリークが上がらなければ、もう片方がそれを読むことができます。したがって、 "応答"が "for"である "クエリ"を確立することは、アプリケーションレベルの問題です。クエリ/応答を定義するプロトコルに組み込まれているか、存在しません。 –

    +0

    私は、私が知っていることを意味します。 :-)しかし、TCPはシーケンス番号を持っているので、私が利用できるトリックがあることを期待していました。 –

    +0

    @Andres:残念ながら、シーケンス番号はTCP層にストリームを組み立てさせるだけです。逆方向の特定のバイト間にどのくらいの時間が経過したかは何も言いません。あなたが最初のリクエストを送信してから 'n'秒が経過したからといって、もう片方がそれを読んでから' n'秒が経過したことを意味しないことに注意してください。だから、もう片方の側から、そのPOVからタイムアウトする前にその応答を送るかもしれませんが、あなたのPOVからのタイムアウト後にあなたと一緒に到着しました。タイムアウトだけでは、TCPは信頼できない時間同期接続で動作する可能性があります。 –

    関連する問題