31

PHP 有两种不同的 API 用于与套接字交互。有基本包装了 C 套接字 API 的低级套接字 API。还有高级流套接字 API,它实现了 PHP 流接口。

不幸的是,流套接字 API 不支持设置低级套接字选项。然而,这是我必须做的事情。同样,套接字 API 不支持使用标准函数调用,如fread,fwritefclose,使其与我的其余代码不兼容。

PHP 5.4 引入了socket_import_stream函数。这允许您获取流套接字并获取底层套接字资源。我的计划是使用它来创建流套接字,获取套接字,在其上设置一些选项,然后继续使用原始流套接字。

这对我不起作用的原因是我需要在绑定之前设置选项。绑定流套接字的唯一方法是使用已经执行绑定的stream_socket_server 。这就是为什么我不能使用它。

我现在正在寻找 , 的倒数socket_import_stream,以便我可以将我的套接字资源转换为流套接字。我一直没能找到这样的功能,但我希望一些非常聪明的人可以帮助我。或者向执行此操作的 PHP 源提交补丁。或者给我一些关于编写这样一个补丁的提示。

编辑:我有一些代码作用于 PHP 流以从中解析 DNS 数据包。我想通过启用多播的套接字重新使用该代码。我无法在流套接字上启用多播,也无法在原始套接字上使用流函数。

EDIT2:我想将此流与 一起使用stream_select,因此不幸的是,自定义流包装器不是一种选择。

4

2 回答 2

6

您可以结合使用stream_wrapper_register函数和实现streamWrapper模板的类来创建多播套接字流。这将允许您利用所有内置的流函数,尽管它不如 socket_export_stream 方便。

于 2012-09-05T17:13:05.120 回答
5

这对我不起作用的原因是我需要在绑定之前设置选项。绑定流套接字的唯一方法是使用已执行绑定的 stream_socket_server。这就是为什么我不能使用它。

stream_socket_server()is的第四个参数$flags,默认为STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,所以不要省略,给0(或其他标志)。

完成所有设置后,您仍然可以使用socket_bind()&手动绑定(& 监听)该套接字socket_listen()

我没试过,只是一个想法。

于 2012-09-10T15:01:46.857 回答