當前位置: 首頁> 最新文章列表> stream_socket_recvfrom函數的詳細使用方法和步驟介紹是什麼?

stream_socket_recvfrom函數的詳細使用方法和步驟介紹是什麼?

gitbox 2025-08-04
<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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"歡迎閱讀本篇PHP教程文章。"</span></span><span>;
</span><span><span class="hljs-meta">?&gt;</span></span><span>

&lt;hr&gt;

</span><span><span class="hljs-meta">&lt;?php</span></span><span>
<span class="hljs-comment">/*
 * 標題:stream_socket_recvfrom函數的詳細使用方法和步驟介紹是什麼?
 *
 * 在PHP中,stream_socket_recvfrom是一個用於從網絡套接字接收數據的函數,通常用於UDP或無連接的套接字通信。
 * 它可以從指定的套接字資源中讀取數據,並且能夠返回發送端的地址信息,方便實現網絡數據交互。
 *
 * 一、函數定義
 * int stream_socket_recvfrom(resource $socket, int $length, int $flags = 0, string &amp;$address = null)
 *
 * 參數說明:
 * - $socket:要從中讀取數據的套接字資源。
 * - $length:最大讀取的字節數。
 * - $flags:可選,控制讀取行為的標誌,預設0。
 * - &amp;$address:可選,傳引用變量,用來接收發送端的地址信息(IP和端口)。
 *
 * 返回值:
 * 返回實際讀取的字節數,失敗時返回false。
 *
 * 二、使用步驟及示例
 *
 * 1. 創建UDP套接字(也可用於TCP但通常用recvfrom用於無連接協議)
 * 2. 綁定本地地址和端口,監聽數據
 * 3. 調用stream_socket_recvfrom接收數據
 * 4. 處理接收到的數據及發送端地址
 *
 * 示例代碼:
 */</span>

</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_server</span></span><span>(</span><span><span class="hljs-string">"udp://0.0.0.0:9999"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, STREAM_SERVER_BIND);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$socket</span></span><span>) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"无法創建UDP套接字:<span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)");
}

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"UDP服務器已啟動,監聽9999端口...\n"</span></span><span>;

</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-literal">true</span></span><span>) {
    </span><span><span class="hljs-variable">$buf</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_recvfrom</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$peer</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$buf</span></span><span> === </span><span><span class="hljs-literal">false</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-keyword">break</span></span><span>;
    }
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"收到來自 <span class="hljs-subst">$peer</span></span></span><span> 的數據: </span><span><span class="hljs-subst">$buf</span></span><span>\n";

    </span><span><span class="hljs-comment">// 可以根據需要回應客戶端</span></span><span>
    </span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-string">"已收到數據:"</span></span><span> . </span><span><span class="hljs-variable">$buf</span></span><span>;
    </span><span><span class="hljs-title function_ invoke__">stream_socket_sendto</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$peer</span></span><span>);
}

<span class="hljs-comment">/*
 * 三、使用注意事項
 * - stream_socket_recvfrom適合無連接協議UDP,TCP連接則多用stream_socket_recv。
 * - 需要處理返回false的情況,避免程序異常。
 * - $address參數是通過引用傳遞,方便獲取發送方信息。
 * - 當傳入的$length過大時,可能會影響性能,建議根據實際數據大小合理設置。
 *
 * 總結:
 * stream_socket_recvfrom是PHP中處理UDP數據包接收的常用函數,靈活且能夠獲取發送端信息,
 * 適合實現簡單的UDP服務器或者網絡通信功能。
 */</span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>