問題タブ [berkeley-sockets]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++: サーバー側ソケットから「書き込み」または「送信」しようとすると、数百回のリクエスト後に -1 が返されます
sys/socket.h
ヘッダーを使用して C++ で基本サーバーのコードを作成しました。サーバーを実行してリクエストに応答するメソッドを以下に示します。Server::keep_server_
メンバー変数 (が true に設定されている) である限り、コードは連続ループで実行されます。JSON 要求を受信すると、マップから適切なハンドラーを検索し、それを呼び出して JSON 応答を生成し、send
/ write
s をクライアントに返します。
このコードは、数百サイクルの要求と応答に対して意図したとおりに機能し、その時点でsend
or write
(両方で試しましたが、それぞれ同じ問題が発生します) が返さ-1
れ、プロセスが終了します。
長時間作業した後、ソケットの書き込みが突然失敗するのはなぜですか? これにどのように対処すればよいですか?
編集: 明確にするために、すべてのクライアント/サーバー アクティビティはローカルで実行されています (つまり、それらは私のマシン上の 2 つの異なるスレッドです)。
編集 2:errno
は 14 です。これは明らかに「不正なファイル記述子」です。
編集 3: 別のユーザーは、最小限の再現可能な例を提供することを推奨しました。エラーは、サーバーにリクエストを繰り返し送信することによって引き起こされるようです。
これを実現するために、まず、特定のクラスをテンプレート パラメーターとして受け取るテンプレート クラスであるサーバー クラスの完全なコードを提供します。std::mem_fn
サーバーは、その構成において、特定のコマンド タイプにバインドするクラスからのいくつかの とともに、このクラスのインスタンスを渡されます。その後、サーバーは、提供されたテンプレート パラメーター クラスのインスタンスで関連するハンドラーを呼び出して、要求を処理します。
また、基本的なクライアント クラスを次のように定義します。
私の問題を再現するには、JSON リクエストを処理するように設計されたメソッドを使用して、基本的なサーバー タイプを定義するだけで済みます。
次に、メソッドをコマンド文字列にマッピングするサーバーをインスタンス化します。大量のリクエストを送信すると、1 秒以内に、send
またはwrite
-1 が返され、プログラムが実行時エラーをスローします。
うまくいけば、これで再現するのに十分です。以前の質問が不適切であった場合は申し訳ありません。
EDIT 4:これは、プログラムごとの最大ファイル記述子に関連する問題である可能性があることに気付きました。ただし、私のプログラムは、失敗する前に正確に 2031 の要求応答サイクルを完了します。これは、最大ファイル記述子の上限と一致していないようです。
socketcan - アップ/ダウン時のSocketCANの動作
SocketCAN アプリケーションが Linux プラットフォームで実行されています。起動すると、適切な設定で canX を構成し、上位層の CAN スタックが使用を開始する前にソケットを起動します (「ip link」/「ifconfig」)。
設計上、アプリケーションはソケットを停止し、問題なく再起動します。ただし、TX フレームが送信されなくなったにもかかわらず、RX フレームがまだ受信されている場合があります。たとえば、新しいコンソールを介して、canX の新しいソケットからフレームを送信するテストは機能します。これは常に発生するわけではなく、ランダムな場合にのみ発生するシナリオです。
ソケットが削除され、再度セットアップされるとどうなりますか? canX のアプリケーションの使用を時代遅れにする記述子またはその他の動的割り当てが変更されていますか?