2009-06-18 4 views
2

バックグラウンド私は、IP経由でサードパーティのサーバと通信する組み込み機器を持っています。サードパーティのサーバーのコードは変更されません。最近のリリースでは、close()を呼び出す前にshutdown()を呼び出すようにip disconnect関数を変更しました(以前はclose()を呼び出していました)。特定の割り込みが発生すると、組み込みデバイスは通信セッションを完了せずに切断されます。これがセッションの間違った場所で発生すると、サーバーは現在、さまざまな理由で顧客に受け入れられないトレースファイルを生成しています。これは、シャットダウンが呼び出されたときにのみ発生し、サーバはこれを送信失敗エラーとして扱い(トレースファイルを生成します)、トレースを必要としない別の終了切断エラーとして扱います。バークレーソケットのシャットダウン機能は、どれくらい重要ですか?

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

おかげで、 パトリック

+0

埋め込みデバイスとサードパーティのサーバでは、どのTCPスタックを使用していますか?すべてのTCPスタックが同じ動作をするわけではありませんw.r.t. 'シャットダウン'対 'クローズ'。また、 'SO_LINGER'オプションを設定していますか? –

+0

どのようにtcpスタックを特定しますか?私たちは最後にSO_LINGERを使用します。 – Patrick

+0

まず、どのオペレーティングシステム(またはライブラリ)とバージョンが関係しているかをお知らせください。 –

答えて

4

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

これは、このシステム(つまり、相互作用するソフトウェアのすべて)が、この種の変更が起こらないほど十分に凍結されているかのように聞こえていると言えます。あなたが本当に何が問題なのかを把握するのではなく、何をしたいのかというと、マネージャーには、何かが本当にわからないことを説明した後、迅速かつ汚れた「ただ使ってclose()」これは他の効果があるかもしれませんが、物事は以前と同じようにうまくいくように見えました。

潜在的に高価な検索をするかどうかは、実際に何が起きているのか、政治的には高価なものか(政治的にはif財務的にではなく)、そのソフトウェアを維持する責任を負う組織の一部の組織は、技術的なものではなく、経営上の決定であり、適切に作成するには技術的なリスクが必要です。

+0

割り込みが発生してもクライアントは実行されていませんが、トレースを必要とするエラーとして正常なシャットダウンが間違って解釈されているのに対して、まっすぐ閉じることは可能です。いずれにしても、トレースファイルのこの側の影響だけで問題なく動作します...とにかく良いアドバイスは、時には、顧客がそれを望む方法を働かせる必要があります、ありがとう。 – Patrick

1

あなたが唯一のプロセスが 特定のソケットに接続されていることがわかっている場合は、近く前にシャットダウン を使用する理由 ありますか?

いいえありません。そこには多くの文書とは対照的に、 FIN/ACKクローズハンドシェイクがまだ送信されていない場合は、クローズします。

編集:ただし、シャットダウンには用途がありません。もちろんあります。あなたが送信を止めたいと思っていて、それを受信者に知らせてもらいたいが受信し続けたいのなら、それはそのためです。別の使用法は、二軍問題をほぼ解決し、同期クローズを得ることです:あなたがEOSを読むなら、シャットダウンとクローズを送信してください。クローズを開始する場合は、シャットダウンを送信し、EOSまで読んで閉じてください。アプリケーションプロトコルが正しい場合は、後の手順でデータを読み取るべきではなく、両端でのクローズがかなり同時であったはずです。

関連する問題