3

HTTP サーバーとして機能する外部デバイスと通信する Delphi 6 アプリケーションがあります。このアプリケーションには ICS TWSocket コンポーネントを使用しています。デバイスと通信するためにソケットを開き、サーバーと通信するために必要なヘッダーとボディの作成を処理します。つまり、私は ICS HTTP クライアント コンポーネントを使用していませんが、下位レベルの TWSocket コンポーネントを使用して、必要な HTTP "ハンドシェイク" を自分で処理しています。

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

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

私の質問は次のとおりです。

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

  • もしそうなら、問題のあるパラメーターを照会し、各トランザクションではなく 30 秒間の非アクティブ時に予想される終了に設定するために使用できる Windows API 関数呼び出しはありますか?

  • その場合、ユーザーのシステムで実行されている他のプログラムに悪影響を与えないように、またはどのように行うことができますか?

4

1 に答える 1

7

サーバーがソケットを閉じています。これには、次の 3 つの理由が考えられます。

  • クライアントが HTTP/1.0 リクエストを行いました
  • クライアントConnection: closeはリクエストにヘッダーを設定しました
  • サーバーは永続的な接続をサポートしていません

HTTP/1.0 は永続的な接続をサポートしていませんでした。サーバーは、HTTP/1.0 要求の後にソケットを正しく閉じます。

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

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

于 2012-04-05T16:13:06.170 に答える