PHP有两个不同的API用于与套接字交互。有低级套接字API基本上包装C套接字API。还有高级流套接字API,它实现了PHP流接口。
不幸的是,流套接字API不支持设置低级套接字选项。但是,这是我必须要做的事情。同样,套接字API不支持使用fread
,fwrite
和fclose
等标准函数调用,这使得它与我的其余代码不兼容。
PHP 5.4引入了socket_import_stream函数。这允许您获取流套接字并获取底层套接字资源。我的计划是使用它来创建流套接字,获取套接字,在其上设置一些选项,然后继续使用原始流套接字。
这对我不起作用的原因是我需要在绑定之前设置选项。绑定流套接字的唯一方法是使用已经执行绑定的stream_socket_server。这就是我无法使用它的原因。
我现在正在寻找socket_import_stream
的反转,以便我可以将我的套接字资源转换为流套接字。我一直无法找到这样的功能,但我希望一些非常聪明的人可以帮助我。或者向PHP源代码提交补丁。或者给我一些关于编写这样一个补丁的提示。
编辑:我有一些代码作用于PHP流来解析来自它的DNS数据包。我想在启用了多播的套接字上重用该代码。我无法在流套接字上启用多播,并且我无法在原始套接字上使用流功能。
EDIT2:我想将此流与stream_select
一起使用,因此不幸的是,自定义流包装器不是一个选项。
答案 0 :(得分:6)
您可以将stream_wrapper_register函数与实现streamWrapper模板的类结合使用来创建多播套接字流。这将允许您利用所有内置流函数,尽管它不如socket_export_stream方便。
答案 1 :(得分:5)
这对我不起作用的原因是我需要在绑定之前设置选项。绑定流套接字的唯一方法是使用已执行绑定的stream_socket_server。这就是我无法使用它的原因。
stream_socket_server()
的第4个参数是$flags
,默认为STREAM_SERVER_BIND | STREAM_SERVER_LISTEN
,所以不要忽略它,给0
(或其他标志)。
完成所有设置后,您仍然可以使用socket_bind()
&手动绑定(& listen)该套接字。 socket_listen()
。
我没有尝试,只是一个想法。