Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将套接字资源转换为流套接字_Php_Sockets_Stream - Fatal编程技术网

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

Php 将套接字资源转换为流套接字,php,sockets,stream,Php,Sockets,Stream,PHP有两个不同的API用于与套接字交互。有一个低级套接字API,它基本上包装了C套接字API。还有高级流套接字API,它实现了PHP流接口 不幸的是,流套接字API不支持设置低级套接字选项。然而,这是我必须做的事情。同样,套接字API不支持使用标准函数调用,如fread、fwrite和fclose,这使得它与我的其余代码不兼容 PHP5.4引入了该函数。这允许您获取流套接字并获取底层套接字资源。我的计划是使用它来创建流套接字,获取套接字,在其上设置一些选项,然后继续使用原始流套接字 这对我不起

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

不幸的是,流套接字API不支持设置低级套接字选项。然而,这是我必须做的事情。同样,套接字API不支持使用标准函数调用,如
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]:错误的文件描述符”。