vxworks 6.3 で LPD サーバーを実行しています。クライアント アプリケーション (制御できない) は、10 分の 1 秒ごとに LPQ クエリを送信しています。235 回のリクエストの後、クライアントは接続を試みるときに RST を受け取ります。しばらくすると、デバイスは再び RST の送信を開始するまで、いくつかのクエリ (約 300) を受け入れます。
RST の原因は TCP スタックであることを確認しました。気づいたことがいくつかあります。
1) 実行中の他のアプリケーションの数を変更すると、受け入れられるソケットの数をいくらか変更できます。たとえば、4 つのソケットを解放して、受け入れられる数を 235 から 239 に変更しました。 RST 開始の発生は 235 で一定のままです。 3) TIME_WAIT を待機しているソケットが多数あります。
4) クライアントのモック バージョンがあります。クライアントの速度を 4 分の 1 秒ごとに 1 つのリクエストに落としても、サーバーは接続を拒否しません。5) サーバーの応答を遅くしても、接続が拒否されることはありません。
したがって、私の理論では、VxWorks が特定の時間に消費できる共有リソースがいくつかあるということです (私の推測では、ソケット ハンドルの総数です)。また、この数は 255 に達すると推測しています。
VxWorks がより多くの接続を受け入れ、閉じたときにそれらを TIME_WAIT のままにしておく方法を知っている人はいますか? カーネル構成を調べて、少しでも可能性が高いと思われるすべての値を変更しましたが、数値を変更できませんでした。
SO_LINGER を設定できることはわかっていますが、これは受け入れられる解決策ではありません。ただし、これにより、クライアント接続が拒否されるのを防ぐことができます。また、SO_LINGER のタイムアウト値を変更しようとしました。これは VxWorks ではサポートされていないようです。オンかオフのどちらかです。
ありがとう!ゲイル