当前位置: 首页> 最新文章列表> 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>