Php 将套接字资源转换为流套接字
PHP有两个不同的API用于与套接字交互。有一个低级套接字API,它基本上包装了C套接字API。还有高级流套接字API,它实现了PHP流接口 不幸的是,流套接字API不支持设置低级套接字选项。然而,这是我必须做的事情。同样,套接字API不支持使用标准函数调用,如Php 将套接字资源转换为流套接字,php,sockets,stream,Php,Sockets,Stream,PHP有两个不同的API用于与套接字交互。有一个低级套接字API,它基本上包装了C套接字API。还有高级流套接字API,它实现了PHP流接口 不幸的是,流套接字API不支持设置低级套接字选项。然而,这是我必须做的事情。同样,套接字API不支持使用标准函数调用,如fread、fwrite和fclose,这使得它与我的其余代码不兼容 PHP5.4引入了该函数。这允许您获取流套接字并获取底层套接字资源。我的计划是使用它来创建流套接字,获取套接字,在其上设置一些选项,然后继续使用原始流套接字 这对我不起
fread
、fwrite
和fclose
,这使得它与我的其余代码不兼容
PHP5.4引入了该函数。这允许您获取流套接字并获取底层套接字资源。我的计划是使用它来创建流套接字,获取套接字,在其上设置一些选项,然后继续使用原始流套接字
这对我不起作用的原因是我需要在绑定之前设置选项。绑定流套接字的唯一方法是使用,它已经执行了绑定。这就是为什么我不能用它
我现在正在寻找socket\u import\u stream
的逆函数,以便将套接字资源转换为流套接字。我还没有找到这样的函数,但我希望一些非常聪明的人能帮助我。或者向执行此操作的PHP源代码提交补丁。或者给我写这样一个补丁的提示
编辑:我有一些代码作用于PHP流来解析其中的DNS数据包。我想用一个支持多播的套接字重新使用该代码。我不能在流套接字上启用多播,也不能在原始套接字上使用流函数
EDIT2:我想将此流与流\u select一起使用,因此很遗憾,自定义流包装器不是一个选项。您可以将该函数与实现模板的类结合使用,以创建多播套接字流。这将允许您利用所有内置流函数,尽管它不如套接字导出流方便
这对我不起作用的原因是我需要在绑定之前设置选项。绑定流套接字的唯一方法是使用已经执行绑定的流套接字服务器。这就是为什么我不能用它
的第四个参数是$flags
,默认为0
(或其他标志)
完成所有设置后,您仍然可以使用socket\u bind()
和socket\u listen()
手动绑定(&listen)该套接字
我没有尝试,只是一个想法。来自PHP源代码的评论:持有对流的zval引用(也可以直接持有PHP流*,但如果将来我们想提供套接字导出流,这可能会稍微好一点)
所以我猜套接字导出流
是您正在寻找的函数,不幸的是,它看起来还没有实现。您只是展示了在实现未描述问题的“解决方案”时遇到的问题。还可以列出原始问题,也许还有其他方法。@Tiberiu IonuțStan我已经添加了关于我的问题的更多信息。@igorw不是从流中导入/导出套接字句柄,您如何扩展套接字流上下文以获取选项数组?在我看来,这将导致更干净的代码。这是正确的解决方案。由于套接字有很多事情可以做,所以实现包装器应该很简单。这有点帮助,但是这个解决方案有一个问题。自定义流不能与流\u select
一起使用,因为无法提取文件描述符。现在将此添加到问题中。我们是否可以直接访问文件描述符,如php://fd/N
要确定当前的流是我们的?@Alexander You,在创建每个流时,您需要了解它们,但这在一些工作中是可能的。自定义流可以与[streamWrapper::stream\u castfunction@Leigh不正确,请注意您链接的第二行中的==0
。@igorw您是对的,出于某种原因,我认为它实际上是在执行&~STREAM\u export\u SERVER
来检索原始标志,并将其与定义为STREAM\u export\u CLIENT
的0进行检查。因此0的标志将跳过绑定/侦听部分。这是一个好主意,但不幸的是,socket\u import\u stream
尝试获取套接字系列,该系列在创建没有标志的服务器时不存在。我得到“警告:socket\u import\u stream():无法获取套接字系列[9]:错误的文件描述符”。