stream_socket_enable_crypto (); Отключает stream_set_timeout

Я создал сервер xmpp, сначала используя не TLS, который работает, как я хочу, без ошибок. Аутентификация дыры работает, и я могу общаться без проблем.

Прежде чем начать чтение из сокета, я сделал:

stream_set_timeout($sock, 0, 1000);

Это позволит мне делать вещи в то время, когда нет новых данных с сервера.

Теперь я реализовал starttls.
я сделал

stream_socket_enable_crypto($sock, true, STREAM_CRYPTO_METHOD_TLS_SERVER);

который получает 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-Negotation работал после этого изменения, но я потерял настройки тайм-аута.

Это моя проблема. stream_set_timeout позвонить после stream_socket_enable_crypto не работает.

У меня есть запись в журнале

echo "AFTER PROCESS MESSAGE QUEUE\n";
$buffer = fread($sock, 4096);
echo "AFTER SOCKET READ\n";

Сообщение ПОСЛЕ ПРОЦЕССА СООБЩЕНИЕ ОЧЕРЕДЬ печатается но ПОСЛЕ РАЗРЯДА не распечатывается и не имеет значения, как долго я жду.

У кого-нибудь есть клей, как я могу установить тайм-аут чтения потока обратно в 1000 микросекунд?

Для вашей информации:
Решение, где я должен установить для stream_set_blocking значение false, в настоящее время НЕ в розыске.
Пока я хочу только блокирующее решение.
Если ДЕЙСТВИТЕЛЬНО не существует другого решения относительно использования неблокирования, то, конечно, я хочу знать 🙂

0

Решение

У меня такая же проблема. stream_select помог мне решить проблему:

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

Другие решения

Других решений пока нет …

А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×