【发布时间】:2012-08-27 18:43:43
【问题描述】:
PHP 有两种不同的 API 用于与套接字交互。有基本包装了 C 套接字 API 的低级套接字 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 一起使用,因此很遗憾,不能选择自定义流包装器。
【问题讨论】:
-
来自 PHP 源代码的评论:
hold a zval reference to the stream (holding a php_stream* directly could also be done, but this might be slightly better if in the future we want to provide a socket_export_stream)bitbucket.org/php/php-src/src/0ef8b095ccda/ext/sockets/… 所以我猜socket_export_stream是你正在寻找的函数,不幸的是它看起来还没有实现。 -
您只是展示了您在为未描述的问题实施“解决方案”时遇到的问题。把原来的问题也摆出来,也许还有其他办法。
-
@Tiberiu-IonuțStan 我添加了一些关于我的问题的更多信息。
-
@igorw 不是从流中导入/导出套接字句柄,您如何看待扩展套接字流上下文以获取选项数组?在我看来,这将导致代码更简洁。