将套接字资源转换为流套接字


Converting a socket resource into a stream socket

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

遗憾的是,流套接字API不支持设置低级套接字选项。然而,这是我必须做的事情。同样,socket API不支持使用freadfwritefclose等标准函数调用,这使得它与我的其余代码不兼容。

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

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

我现在正在寻找socket_import_stream的反向,这样我就可以将套接字资源转换为流套接字。我还没能找到这样的函数,但我希望一些非常聪明的人能帮助我。或者向做这件事的PHP源代码提交一个补丁。或者给我写这样一个补丁的提示。

编辑:我有一些代码可以作用于PHP流来解析其中的DNS数据包。我想在启用多播的套接字中重用这些代码。我不能在流套接字上启用多播,也不能在原始套接字上使用流函数。

EDIT2:我想将这个流与stream_select一起使用,所以不幸的是,自定义流包装器不是一个选项。

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

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

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

完成所有设置后,您仍然可以使用socket_bind()&CCD_ 11。

我没有尝试,只是一个想法。