私は、HTTPサーバーとして機能する外部デバイスと通信するDelphi 6アプリケーションを持っています。私はこのアプリケーションにICS TWSocketコンポーネントを使用しています。私はデバイスと話をするためのソケットを開き、サーバーと通信するのに必要なヘッダーとボディーの作成を処理します。言い換えれば、私はICS HTTPクライアントコンポーネントを使用せず、下位レベルのTWSocketコンポーネントを使用し、必要なHTTPハンドシェークを自分で処理しています。HTTPトランザクションごとにソケットがすぐに閉じる原因は何ですか?
私が作成し、外部デバイスに送信するヘッダーは、キープアライブフラグがTRUEに設定されています。私のシステムでは、外部デバイスに何かを送信した後、接続は連続して開いたままになり、約30秒の非アクティブが発生するまで閉じません(30秒間、外部デバイスからHTTPサーバーとして要求しません) 。私は、外部デバイスがそれを閉じるかどうか、またはMicrosoft Windowsがそれを行うかどうかわからない。しかし、重要なポイントは、通常、私は複数の送信を行うことができ、私は約30秒間何も送信しない限り、接続は開いたままになります。これは正常に動作し、私のコードが期待しているものです。
しかし、一部のユーザシステムでは、送信ごとにソケットが閉じています。閉じたソケットをチェックし、必要に応じて外部デバイスへの再接続を試みるコードがありますが、各トランザクションで再接続する必要はありません。
私の質問は以下のとおりです。
一部のユーザーのシステムでは、この異常な動作を引き起こしている可能性がありますソケットのシステム設定はありますか?
もしそうなら、問題のパラメータをクエリし、各トランザクションではなく30秒間非アクティブになると予想されるクローズに設定できるWindows API関数呼び出しがありますか?
もしそうなら、ユーザーシステム上で実行されている他のプログラムに悪影響を及ぼさない方法でそれを行うことはできますか?
外部デバイスは常に同じバージョンで、同じ設定を使用していて、何らかの種類のプロキシ経由で接続されていませんか?なぜなら、差異は異なるサーバーや途中の何かによって引き起こされるようだからです。 – mjn
これは、特定のデバイスで実行されているHTTP/1.0だけかもしれません。バージョン1.0には永続的な接続がありませんでした。いずれにせよ、wiresharkはあなたの友人です。 –
まず、Microsoft Network MonitorまたはWiresharkを使用して、接続がどのように閉じられているか(どちらがTCPリセットを送信しているか)を確認し、分析をさらに開始してください。 –