ホームページ > php教程 > PHP开发 > Linux ネットワーク プログラミング -- shut_down 関数と close() 関数の違い

Linux ネットワーク プログラミング -- shut_down 関数と close() 関数の違い

高洛峰
リリース: 2016-12-13 15:46:07
オリジナル
1962 人が閲覧しました

Linux C ネットワーク プログラミングでは、接続されたネットワーク通信を閉じるには close 関数と shutdown 関数の 2 つのメソッドがあります。

1 #include 2 int close(intsockfd) )

3 //戻り値: 0 - 成功、1 - 失敗

4

5 #include

6 int shutdown(intsockfd,inthow to)

7 //戻り値: 0 -成功、1 - 失敗

TCP ソケットで close() を呼び出すデフォルトのアクションは、ソケットをクローズ済みとしてマークし、すぐに API を呼び出すプロセスに戻ります。このとき、アプリケーション層から見ると、ソケット fd はプロセスで使用できなくなります。つまり、読み取りまたは書き込みのパラメータとして使用できなくなります。トランスポート層の観点から見ると、TCP は送信バッファに現在蓄積されているデータをリンクに送信しようとし、その後 TCP の 4 つのウェーブを開始して TCP 接続を完全に閉じます。

close() を呼び出すのは TCP 接続を閉じる通常の方法ですが、この方法には 2 つの制限があり、これが shutdown() が導入される理由です:

1) close() は実際にはソケットの参照カウントをデクリメントするだけですfd を 1 ずつ増やします。ソケット fd の参照カウントが 0 に減った場合にのみ、TCP トランスポート層は 4 ウェイ ハンドシェイクを開始して接続を実際に閉じます。シャットダウンは、参照カウントに制限されることなく、接続を閉じるために必要な 4 つのハンドシェイクを直接開始できます。
2) close() は、TCP 二重リンクを終了します。 TCP 接続の全二重の性質により、次のようなアプリケーション シナリオが存在する可能性があります。この場合、ローカル ピアはリモート ピアにデータを送信しなくなりますが、リモート ピアにはまだ送信するデータがある可能性があります。ローカル ピアは、リモート ピアにデータの送信は行わないがデータの受信は継続することを通知するために、close() を使用することはできませんが、shutdown() でこのタスクを完了できます。



close 関数と shutdown 関数の最初のパラメータは両方ともファイル記述子を表します。 Linux オペレーティング システムでは、すべてがファイルとして扱われ、デバイスやメモリなどのあらゆるものがファイルとしてシミュレートされることはわかっています。もちろん、ネットワーク間の通信も例外ではありません。各通信セッションにはそれに対応するファイル記述子があり、それらの間の操作はローカル ファイルの操作とまったく同じです。シャットダウン関数には、次の 3 つの値を持つパラメータ howto もあります

SHUT_RD: 読み取り半分を閉じる この時点で、ユーザーはこのソケットからデータを読み取ることはできなくなり、このソケットによって受信されたデータも読み取れなくなります。ソケットは破棄されます。ピアはこのプロセスを認識しません。接続の読み取り側を閉じます。つまり、ソケットはデータを受け入れなくなり、現在ソケットの受信バッファーにあるデータはすべて破棄されます。プロセスはソケットに対して読み取り操作を発行できなくなります。 TCP ソケットでのこの呼び出しの後に受信されたデータはすべて確認応答され、通知なく破棄されます。

SHUT_WR: これに応じて書き込み半分をオフにします。この時点で、ユーザーはソケットにデータを書き込むことができなくなり、カーネルはそれ以上のデータを送信しなくなります。 。ピアが読み取りを試みると、エラーが発生する可能性があります。

SHUT_RDWR: 読み取り側と書き込み側をオフにします。現時点では、ユーザーはソケットから読み取りまたは書き込みを行うことができません。これは、SHUT_RD を 1 回指定し、SHUT_WR を 1 回指定してシャットダウン関数を再度呼び出すことと同じです。

SHUT_** は関数ライブラリ内のマクロによって定義されます。shutdown は 2 番目のマクロを提供するため、close 関数では不可能なソケット記述子のクローズを正確に制御できます。マルチスレッド環境では、記述子は複数のスレッドによってコピーされる可能性があり、それらはファイルに関連付けられており、カーネルは参照カウントが 0 の場合にのみファイル記述子を閉じることができます。

close 関数の使用には 2 つの制限がありますが、shutdown を使用することで回避できます。


close 関数は、記述子の参照カウントを 1 つデクリメントし、カウントが 0 になった場合にのみソケットが実際にクローズされます。 shutdown の使用 この関数は、参照カウントに関係なく、TCP の通常の接続終了シーケンスをトリガーできます。

close 関数は、読み取り方向と書き込み方向の両方でデータ送信を終了します。 TCP 接続は全二重であるため、データ送信用のチャネルを閉じるだけで、データの送信が完了したことをピアに通知する必要がある場合がありますが、この制御はまだピアによって送信されたデータを受信することのみです。これはシャットダウン機能を使用して実現できます。

1>。複数のプロセスがソケットを共有する場合、close が呼び出されるたびに、カウントが 0 に達するまで (つまり、使用されているすべてのプロセスが close を呼び出して) ソケットが解放されるまで、カウントは 1 ずつ減らされます。

2>. マルチプロセスでは、1 つのプロセスがシャットダウン (sfd、SHUT_RDWR) しても、他のプロセスは通信できなくなります。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート