2

背景として、IPを介してサードパーティのサーバーと通信する組み込みデバイスがあります。サードパーティサーバーのコードが変更される可能性はほとんどありません。最近のリリースでは、close()を呼び出す前にshutdown()を呼び出すようにipdisconnect関数を変更しました(以前はclose()を呼び出していました)。特定の割り込みが発生した場合、組み込みデバイスは通信セッションを完了せずに切断します。これがセッションの間違った時点で発生すると、サーバーはトレースファイルを生成しますが、これはさまざまな理由で顧客に受け入れられません。これは、shutdownが呼び出された場合にのみ発生し、サーバーはこれを送信失敗エラーとして扱い(そしてトレースファイルを生成し)、より突然のclose()をトレースを必要としないもう一方の端の切断エラーとして扱います。

したがって、明らかな解決策は、shutdownの呼び出しを停止することです。この質問でのBarnes氏の回答は、2つの機能を適切に説明していますが、特定のソケットに1つのプロセスしか接続されていないことがわかっている場合、閉じる前にシャットダウンを使用する理由はありますか?

ありがとう、パトリック

4

2 に答える 2

4

「突然の切断」が通信プロトコルの一部になったかのように聞こえますが、これは良いことではありません。shutdown()「特定の割り込みが発生した」後もクライアントが長時間実行されて、使用するかどうかを決定するかclose()、相手が見るものに影響を与える場合は、プロトコルを更新して「このセッションは中止されました」というメッセージを確実に配信することをお勧めします。 "

とは言っても、このシステム (つまり、相互作用するすべてのソフトウェア) が (サーバー上で) 1 ビットひどくフリーズしたため、この種の変更は決して起こらないように聞こえます。おそらく、あなたがやりたいことは、問題が実際に何であるかを理解するのではなく、マネージャーに、close()他に何があるか本当にわからないことを説明した後、迅速で汚い「ただ使用する」ソリューションを承認してもらうことです。これは影響を与える可能性がありますが、以前は問題なく動作していたようです。(その変更を行ってから、他のバグが消えたことに気付いていませんか?)

ここで実際に何が起こっているのかを確認するために、費用がかかる可能性のある検索を行うかどうかを決定することは、そのソフトウェアの保守を担当する反対側の組織との費用がかかる可能性がある (経済的ではないにしても、政治的に) ことは、実際には管理上の決定であり、技術的な決定ではありません。 1つは、適切に作成するためには、技術的なリスクについて通知する必要があります。

于 2009-06-18T10:48:17.817 に答える
1

特定のソケットに接続されているプロセスが1つだけであることがわかっている場合、閉じる前にシャットダウンを使用する理由はありますか?

いいえ、ありません。そこにある多くのドキュメントとは対照的に。Closeは、FIN / ACKがまだ送信されていない場合、ハンドシェイクを閉じます。

編集:しかし、それはシャットダウンがその用途を持っていないということではありません:もちろんそれはあります。送信を停止し、受信者にそのことを知らせたいが、受信を続けたい場合は、それが目的です。もう1つの使用法は、二人の将軍問題をほぼ解決し、同期されたクローズを取得することです。EOSを読み取った場合は、シャットダウンを送信してクローズします。クローズを開始する場合は、シャットダウンを送信し、EOSまで読み取ってからクローズします。アプリケーションプロトコルが正しい場合、後のステップではデータを読み取らないはずであり、両端でのクローズはかなり同時に行われます。

于 2010-12-07T02:08:54.220 に答える