現在の位置: ホーム> 最新記事一覧> socket_shutdownを使用して、socket_wsaprotocol_info_importによる接続をエレガントに閉じる方法

socket_shutdownを使用して、socket_wsaprotocol_info_importによる接続をエレガントに閉じる方法

gitbox 2025-08-14

わかりました、私はあなたの要件を理解しています。指定したトピックを含むPHPに関する技術的な記事を書き、身体から水平線の前後に身体に関連していない部分を分離します。以下は記事の内容です。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 事前に依存しないコードの例</span></span><span>
</span><span><span class="hljs-variable">$placeholder</span></span><span> = </span><span><span class="hljs-string">"コードのこの部分はテキストとは何の関係もありません"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$placeholder</span></span><span>;
</span><span><span class="hljs-meta">?&gt;</span></span><span>

--------------------------------------------------

</span><span><span class="hljs-comment"># 合格 socket_wsaprotocol_info_import マッチ socket_shutdown 接続をエレガントに閉じる方法</span></span><span>

使用中 PHP プログラミングネットワークの場合,TCP ソケット管理が重要な問題です。特にサーバーまたはクライアントが多数の同時接続を処理する必要がある場合,データを失うことなく優雅に接続を閉じる方法は重要な課題になります。本文将介绍合格 `socket_wsaprotocol_info_import` マッチ `socket_shutdown` エレガントな閉鎖を達成するため TCP 接続方法。

</span><span><span class="hljs-comment">## 1つ、背景</span></span><span>

通常,关闭1つ个 TCP 接続は直接呼び出すことができます `</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>()`。しかし,クライアントまたはサーバーにまだデータがない場合,直接シャットダウンは、データの損失を引き起こすか、例外をトリガーする場合があります。この問題を解決するために,使用できます Windows プラットフォームの下 `WSAPROTOCOL_INFO` 機構,ソケット情報を新しいハンドルにインポートします,然后合格 `socket_shutdown` 接続を段階的に閉じます。

</span><span><span class="hljs-comment">## 二、コアメソッド</span></span><span>

</span><span><span class="hljs-number">1</span></span><span>. **得る WSAPROTOCOL_INFO 情報**

   存在する Windows 下,每个套接字都可以得る对应的 `WSAPROTOCOL_INFO` 结构情報,ソケットのプロトコルと最先端を説明するために使用されます。

   ```php
   </span><span><span class="hljs-variable">$sock</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
   </span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>, </span><span><span class="hljs-string">"127.0.0.1"</span></span><span>, </span><span><span class="hljs-number">8080</span></span><span>);
   
   </span><span><span class="hljs-variable">$protocol_info</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
   </span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_export</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$protocol_info</span></span><span>);
</span></span>
  1. ソケット情報をインポートします

    socket_wsaprotocol_info_importを使用して、同じソケット情報を別のプロセスまたはハンドルでインポートし、それによってライフサイクルを安全に管理します。

     <span><span><span class="hljs-variable">$imported_sock</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_import</span></span><span>(</span><span><span class="hljs-variable">$protocol_info</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
    </span></span>
  2. 接続をエレガントに閉じます

    Socket_shutdownの呼び出しは、ソケットの読み取り、書き込み、または読み取りチャネルを指定して閉じることができ、バッファ内のデータがそのまま送信されるようにします。

     <span><span><span class="hljs-comment">// 最初に書き込みチャネルを閉じます,データが送信されていることを確認してください</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$imported_sock</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>);
    
    </span><span><span class="hljs-comment">// オプション:ピアがデータが受信されたことを確認するのを待ちます</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>);
    
    </span><span><span class="hljs-comment">// 最後に、読書チャネルを閉じます</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$imported_sock</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
    
    </span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$imported_sock</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>);
    </span></span>

3。注意すべきこと

  1. Windowsプラットフォームのみに適用できます
    socket_wsaprotocol_info_exportおよびsocket_wsaprotocol_info_importはWindows固有のAPIであり、Linux/UNIXシステムでは使用できません。

  2. データの整合性<br> socket_shutdownを呼び出して書き込みチャネルを閉じた後、データがバッファから送信されていることを確認する必要があります。そうしないと、クライアントが不完全なデータを受信する可能性があります。

  3. マルチスレッドまたはマルチプロセスシナリオ<br> インポートされたソケットは、さまざまなスレッドまたはプロセスで使用して、負荷分散や非同期処理などの複雑なネットワーク通信モデルの実装を促進できます。

4。概要

socket_wsaprotocol_info_importを使用して、 socket_shutdownを使用して、WindowsプラットフォームでTCPソケットのエレガントなシャットダウンを実現できます。完全なデータ送信を確保し、マルチプロセスまたはマルチスレッドの安全な管理ソケットを可能にします。高い信頼性通信を必要とする高い並行サーバーまたはクライアントプログラムの場合、この方法は参照と実践に値します。

 <span><span><span class="hljs-comment">// 独立後のコードの例</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"記事の終わり,他の無関係なロジックを実行します"</span></span><span>;
</span><span><span class="hljs-variable">$dummy</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(function(</span><span><span class="hljs-variable">$i</span></span><span>) { </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$i</span></span><span> * </span><span><span class="hljs-number">2</span></span><span>; }, </span><span><span class="hljs-title function_ invoke__">range</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>));
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>