<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 這部分與文章內容無關,可以是任意 PHP 代碼示例</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"開始執行程序...\n"</span></span><span>;
</span><span><span class="hljs-variable">$time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">"Y-m-d H:i:s"</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"當前時間:<span class="hljs-subst">$time</span></span></span><span>\n";
</span><span><span class="hljs-variable">$randomNumber</span></span><span> = </span><span><span class="hljs-title function_ invoke__">rand</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">100</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"隨機數生成:<span class="hljs-subst">$randomNumber</span></span></span><span>\n";
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
</span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 正文部分:關於 socket_clear_error 在 UDP 與 TCP 套接字中的使用差異</span></span><span>
<span class="hljs-comment">/**
* 標題:socket_clear_error在UDP與TCP套接字中的使用差異
*
* PHP 提供了 socket_clear_error() 函數,用於清除指定套接字上的錯誤狀態,並返回清除前的錯誤代碼。
* 它常與 socket_last_error() 搭配使用,用於錯誤處理和調試。
*
* UDP(User Datagram Protocol)與 TCP(Transmission Control Protocol)在网络通信模型上有显著差异,
* 因此 socket_clear_error() 的使用場景和表現也有所不同。
*
* 1. TCP 套接字的特點
* - 面向連接:在通信前需要建立連接(三次握手)。
* - 可靠傳輸:數據包丟失時會自動重傳。
* - 錯誤明確:任何發送或接收錯誤通常會立即反饋。
*
* 在 TCP 套接字中,如果出現寫入失敗、連接中斷或讀取超時等問題,
* socket_last_error() 會返回具體的錯誤碼。使用 socket_clear_error() 可以清除這些錯誤碼,
* 為後續操作提供乾淨狀態。通常用於:
* - 捕獲連接異常後重試
* - 清理 socket 狀態以避免殘留錯誤影響下一次通信
*
* 2. UDP 套接字的特點
* - 無連接:發送數據前不建立正式連接。
* - 不可靠傳輸:數據包可能丟失或亂序,協議本身不保證交付。
* - 錯誤反饋有限:大多數情況下無法直接獲得發送失敗的具體錯誤。
*
* 在 UDP 套接字中,即便發送失敗(例如目標不可達),很多系統不會立即將錯誤返回給套接字。
* 因此 socket_last_error() 往往返回 0,或者僅在極少數情況(如本地網絡接口錯誤)時返回錯誤碼。
* 對 UDP 套接字調用 socket_clear_error() 的效果也相對有限,主要用於:
* - 清理本地套接字狀態
* - 確保 socket_last_error() 返回乾淨狀態,便於統一錯誤處理邏輯
*
* 3. 使用示例
*/</span>
</span><span><span class="hljs-variable">$tcp_socket</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-variable">$udp_socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_DGRAM, SOL_UDP);
</span><span><span class="hljs-comment">// TCP 連接示例</span></span><span>
@</span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$tcp_socket</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">$tcp_error_before</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$tcp_socket</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_clear_error</span></span><span>(</span><span><span class="hljs-variable">$tcp_socket</span></span><span>);
</span><span><span class="hljs-variable">$tcp_error_after</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$tcp_socket</span></span><span>);
</span><span><span class="hljs-comment">// UDP 發送示例</span></span><span>
@</span><span><span class="hljs-title function_ invoke__">socket_sendto</span></span><span>(</span><span><span class="hljs-variable">$udp_socket</span></span><span>, </span><span><span class="hljs-string">"測試數據"</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-string">"測試數據"</span></span><span>), </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-string">"127.0.0.1"</span></span><span>, </span><span><span class="hljs-number">8081</span></span><span>);
</span><span><span class="hljs-variable">$udp_error_before</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$udp_socket</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_clear_error</span></span><span>(</span><span><span class="hljs-variable">$udp_socket</span></span><span>);
</span><span><span class="hljs-variable">$udp_error_after</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$udp_socket</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"TCP 錯誤碼清理前:<span class="hljs-subst">$tcp_error_before</span></span></span><span>, 清理後:</span><span><span class="hljs-subst">$tcp_error_after</span></span><span>\n";
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"UDP 錯誤碼清理前:<span class="hljs-subst">$udp_error_before</span></span></span><span>, 清理後:</span><span><span class="hljs-subst">$udp_error_after</span></span><span>\n";
<span class="hljs-comment">/**
* 總結:
* - TCP 套接字的错误状态通常與连接可靠性直接相关,socket_clear_error() 可以有效清理這些錯誤。
* - UDP 套接字錯誤狀態反饋有限,socket_clear_error() 主要用於保持一致的错误处理机制。
* - 在實際開發中,對 TCP 和 UDP 使用 socket_clear_error() 都有意義,但 TCP 的作用更為明顯。
*/</span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>