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 在阻塞模式下使用fgets()获取流套接字的所有内容_Php_Sockets_Websocket_Stream - Fatal编程技术网

Php 在阻塞模式下使用fgets()获取流套接字的所有内容

Php 在阻塞模式下使用fgets()获取流套接字的所有内容,php,sockets,websocket,stream,Php,Sockets,Websocket,Stream,为了在ssl中完成WebSocket的握手,必须以阻塞模式读取套接字。使用流套接字,通过fwrite()和fgets()从php后端与(javascript)客户端进行通信。在阻塞模式下,fgets()将等待下一行输入,然后抓取一行。一旦建立了套接字连接,客户端就会向PHP发送一些头,以便完成握手。问题是,我想不出一种方法来找到标题的结尾,因为顺序取决于所使用的浏览器 我在chrome上使用了这种变通方法(因为sec websocket extensions行是最后发送的标题) 但这在firef

为了在ssl中完成WebSocket的握手,必须以阻塞模式读取套接字。使用流套接字,通过
fwrite()
fgets()
从php后端与(javascript)客户端进行通信。在阻塞模式下,
fgets()
将等待下一行输入,然后抓取一行。一旦建立了套接字连接,客户端就会向PHP发送一些头,以便完成握手。问题是,我想不出一种方法来找到标题的结尾,因为顺序取决于所使用的浏览器

我在chrome上使用了这种变通方法(因为sec websocket extensions行是最后发送的标题)

但这在firefox等其他浏览器中不起作用,在firefox中,此头是第一个发送的头P


(我认为,
fread()
应该做我想要做的事情——在阻塞模式下,当它进入时,它应该在套接字上获取“一切”…但是当我尝试fread时,它返回了一个空白字符串。:p
stream\u get\u contents()
是一样的)

尽管我不能给你一个PHP建议,您可能需要考虑以下几点:

I.你想要什么样的“一切”?TCP中没有消息边界,因此“流中的所有内容”相当于“随机排列的数据量”。不幸的是,您不会神奇地读取所有HTTP头并停在那里

II.给定第一点,您必须找到将HTTP头与HTTP正文分开的内容。这实际上相当简单,因为标头以。因此,只需读取数据,直到收到
CRLF-CRLF
*。在PHP中,您很可能会将
CRLF
视为
\n
,尽管这可能取决于操作系统

III.如果要实现WebSocket,那么使用
fgets
是有问题的,因为协议的其余部分(在HTTP握手之后)是二进制的。您可能希望使用专用的PHP套接字模块,而不是
fread
。我不能说这两个函数有什么不同,但是
socket.*
函数只是BSD套接字的包装,BSD套接字可以用多种语言实现。因为他们大多不懂语言,你会在网上找到更多的支持和教程


*根据HTTP标准:

CR = <US-ASCII CR, carriage return (13)>
LF = <US-ASCII LF, linefeed (10)>
CR=
LF=

像您在(II)中所说的那样寻找一个空行正是我想要的。我明白您在(III)中所说的,但是
socket\u recv()
只适用于不是流式套接字的套接字。流套接字有一个名为
Stream\u get\u content()
的函数,但据我所知,它不支持阻塞,这是完成ssl握手所必需的。我尝试了各种方法,使用
fgets()
就是有效的方法。
CR = <US-ASCII CR, carriage return (13)>
LF = <US-ASCII LF, linefeed (10)>