stream_socket_enable_crypto(); Disables stream_set_timeout



我创建了一个xmpp服务器,首先使用了非tls,它可以按照我的要求正常工作,没有任何错误。漏洞身份验证有效,我可以毫无问题地聊天。

在我开始从插座上阅读之前,我做了:

stream_set_timeout($sock, 0, 1000); 

这将使我能够在服务器没有新数据的时间内完成任务。

现在我实现了starttls。我做了

stream_socket_enable_crypto($sock, true, STREAM_CRYPTO_METHOD_TLS_SERVER);

它为我协商tls。这不起作用,因为发生了读取超时,tls协商失败。

我将上面的stream_socket_enable_crypto更改为

stream_set_timeout($sock, 30, 0);
stream_socket_enable_crypto($sock, true, STREAM_CRYPTO_METHOD_TLS_SERVER);
stream_set_timeout($sock, 0, 1000);

将超时设置得更高一点,这样客户端就有30秒的时间接受证书(如果是自签名的(并完成所有的tls操作。完成后,我真的需要将超时时间设置回1000微秒。TLS Negotiation在更改后工作,但我丢失了超时设置。

这是我的问题。stream_socket_enable_crypto之后的stream_set_timeout调用不起作用。

我有一个日志条目

echo "AFTER PROCESS MESSAGE QUEUEn";
$buffer = fread($sock, 4096);
echo "AFTER SOCKET READn";

将打印消息AFTER PROCESS message QUEUE,但不会打印出AFTER SOCKET READ并且无论我等待多长时间。

有人知道我如何将流读取超时设置回1000微秒吗?

供您参考:当前需要将stream_set_blocking设置为false的解决方案NOT。现在我只想要一个阻塞解决方案。如果真的没有其他解决方案来使用非阻塞,那么我当然想知道:(

我也遇到了同样的问题。stream_select帮我解决了问题:

$buffer='';
$select=array('con1'=>$socket);
$timeout_sec=1;
if(stream_select($select, $null, $null, $timeout_sec)){
    $buffer = fread($socket, $size);
}

相关内容

  • 没有找到相关文章

最新更新