4

私は、クライアントがサーバー側から決定されたメモリアドレスを持っているクライアントサーバーアプリを書いています。

何か問題が発生し、サーバーを再起動する必要がある場合、クライアントのアドレスは無効になります。その無効な情報を使用する関数を使用すると、アドレスがもうサーバーではない可能性があるため、SIGSEGV がサーバーに送信されます。

サーバーが SIGSEGV から自身を保護し、接続を受け入れて正常に動作し続けるにはどうすればよいでしょうか? これが発生したときにサーバーをクラッシュさせない方法はありますか?

どうもありがとうございました。

4

3 に答える 3

12

クライアントはサーバーにメモリ アドレスを送信しないでください。クライアントがサーバー リソースへの参照を必要とする場合、サーバーは、サーバーがアドレスに変換できる何らかの種類のハンドルをクライアントに提供する必要がありますが、これは直接逆参照されません。

あなたの場合、サーバーの再起動により、クライアントのハンドルが無効になった可能性があります。サーバーはこれに気づき、よく理解されたエラー コードをクライアントに返し、新しいリソース ハンドルを取得するように伝えます。

于 2010-03-24T20:04:05.817 に答える
0

ポインタが格納されている接続のテーブルを管理します。サーバーが再起動すると、新しいテーブルが再構築されます。クライアントは、その接続のインデックス (またはキーなど) しか知りません。

コンテキストは指定されていませんが、クライアントにポインターを送信すると、クライアントがサーバーを非常に簡単にクラッシュさせる可能性があるため、大きなセキュリティ ホールになる可能性があります。

于 2010-03-24T20:04:26.577 に答える
0

ポインターを使用する代わりに、配列またはマップのインデックスを使用します。これにより、インデックスが再利用される可能性がありますが、非常に無効なインデックスを検出して無視するのは簡単です。

于 2010-03-24T20:05:08.040 に答える