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

2022-08-30 14:39:11

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

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

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

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

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

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

编辑2:我想将此流与 一起使用,因此不幸的是,自定义流包装器不是一个选项。stream_select


答案 1

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


答案 2

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

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

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

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


推荐