2012-04-05 9 views
2

私は、HTTPサーバーとして機能する外部デバイスと通信するDelphi 6アプリケーションを持っています。私はこのアプリケーションにICS TWSocketコンポーネントを使用しています。私はデバイスと話をするためのソケットを開き、サーバーと通信するのに必要なヘッダーとボディーの作成を処理します。言い換えれば、私はICS HTTPクライアントコンポーネントを使用せず、下位レベルのTWSocketコンポーネントを使用し、必要なHTTPハンドシェークを自分で処理しています。HTTPトランザクションごとにソケットがすぐに閉じる原因は何ですか?

私が作成し、外部デバイスに送信するヘッダーは、キープアライブフラグがTRUEに設定されています。私のシステムでは、外部デバイスに何かを送信した後、接続は連続して開いたままになり、約30秒の非アクティブが発生するまで閉じません(30秒間、外部デバイスからHTTPサーバーとして要求しません) 。私は、外部デバイスがそれを閉じるかどうか、またはMicrosoft Windowsがそれを行うかどうかわからない。しかし、重要なポイントは、通常、私は複数の送信を行うことができ、私は約30秒間何も送信しない限り、接続は開いたままになります。これは正常に動作し、私のコードが期待しているものです。

しかし、一部のユーザシステムでは、送信ごとにソケットが閉じています。閉じたソケットをチェックし、必要に応じて外部デバイスへの再接続を試みるコードがありますが、各トランザクションで再接続する必要はありません。

私の質問は以下のとおりです。

  • 一部のユーザーのシステムでは、この異常な動作を引き起こしている可能性がありますソケットのシステム設定はありますか?

  • もしそうなら、問題のパラメータをクエリし、各トランザクションではなく30秒間非アクティブになると予想されるクローズに設定できるWindows API関数呼び出しがありますか?

  • もしそうなら、ユーザーシステム上で実行されている他のプログラムに悪影響を及ぼさない方法でそれを行うことはできますか?

+0

外部デバイスは常に同じバージョンで、同じ設定を使用していて、何らかの種類のプロキシ経由で接続されていませんか?なぜなら、差異は異なるサーバーや途中の何かによって引き起こされるようだからです。 – mjn

+4

これは、特定のデバイスで実行されているHTTP/1.0だけかもしれません。バージョン1.0には永続的な接続がありませんでした。いずれにせよ、wiresharkはあなたの友人です。 –

+0

まず、Microsoft Network MonitorまたはWiresharkを使用して、接続がどのように閉じられているか(どちらがTCPリセットを送信しているか)を確認し、分析をさらに開始してください。 –

答えて

6

サーバーがソケットを閉じています。このための3つの可能な理由があります:1.0要求

  • は、クライアントが要求
  • Connection: closeヘッダーを設定

    • クライアントはHTTPを作った/サーバは、持続的な接続

    をサポートしていません。 HTTP/1.0は永続的な接続をサポートしておらず、HTTP/1.0要求後にソケットを閉じる際にサーバーが正しくなります。

    HTTP/1.1は、クライアントがConnection: closeヘッダーを指定しない限り、接続が暗黙的に永続的であることを指定します。このヘッダーを受信した場合、サーバーは接続を閉じる際に正しくなります。サーバーが永続的な接続をサポートしていない場合は、接続を閉じる際にも正しくなります。

    HTTP/1.1を使用している場合は、Connection: keep-aliveヘッダーを送信して、接続が(サーバーがサポートしている限り)永続的になるように強制できます。また、Keep-Alive: timeout=<secs>, max=<max-requests>ヘッダーを送信する必要があります。<secs><max-requests>は、目的の動作を表す整数です。

  • +2

    HTTP 1.0の場合、クライアントは永続的な接続を求めるために 'Connection:keep-alive'リクエストヘッダを送ることができます。ほとんどのHTTP 1.0サーバは非公式の拡張機能として、HTTP 1.0では 'keep-alive'がデフォルトで有効になっていないので、これをサポートしています。サーバの 'Connection'レスポンスヘッダは、キープアライブが有効かどうかを示します。 –

    +0

    @DaveRandom - 下記の私のコメントを見て、レミーに感謝します。 –

    +0

    @RemyLebeau(およびDave) - サーバーは応答ヘッダーに従ってHTTP 1.0と表示されます。「HTTP/1.0 200 OK」+「Server:WYM/1.0」です。私はいつも "Connection:keep-alive"という行を持っていましたが、リクエストにKeep-Alive timeout = 30 max = 3行だけ追加しました。サーバーは、200 OKステータスの "Connection:Keep-Alive" + "Keep-Alive:timeout = 3600、max = 108000"の応答ヘッダーに次の行を返します。それはHTTP 1.0のサポートにもかかわらず、成功していることを示していますか?しかし、私はユーザからのデバッグログをチェックし、それらの2つのキープアライブラインは実際にすでにサーバから戻ってきています。 –

    関連する問題