PHP SSL «старые» потоковые сокеты неожиданно закрываются ⇐ Php
-
Anonymous
PHP SSL «старые» потоковые сокеты неожиданно закрываются
Я разрабатываю сервер веб-сокетов SSL, PHP 8.2.
Я без проблем принимаю SSL-соединения.
Проблема:
Принимаются соединение A, затем B, затем C, затем D.
Когда соединение C закрывается (отключение совершают клиенты, а не сервер), то соединения A и B неожиданно закрываются (но не D).
При выполнении операции "fread" в сокете потока A или B будет выдано следующее предупреждение: fread(): операция SSL не удалась с кодом 1. Сообщения об ошибках OpenSSL: ошибка: 140943FC: процедуры SSL: ssl3_read_bytes: предупреждение sslv3 о плохой записи Mac в....
Чтение через сокет D будет продолжаться.
Это происходит только при SSL-соединениях, а не при незашифрованных соединениях.
Фактически, все сокеты, открытые ДО закрывающегося сокета, также закрываются.
Пример моего кода:
$транспорт = 'tlsv1.3'; $ssl = ['ssl' => [ 'local_cert' => $sslCert, 'local_pk' => $sslKey, 'disable_compression' => true, 'verify_peer' => ложь, 'allow_self_signed' => правда, 'ssltransport' => $транспорт, ] ]; $context =stream_context_create($ssl); $socketS =stream_socket_server( 'ssl://0.0.0.0:'.$wssPort, $ошибка, $ошибка, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $контекст ); .... делать { $tCpy = массив ($socketS); $retSocket=stream_select($tCpy, $null, $null, 20, 0); если ($retSocket>0 ) { // Новое соединение stream_set_blocking($socketS, правда); $cliSocket =stream_socket_accept($socketS,5,$ip); ... $pid = pcntl_fork(); если ($pid>0) { // ХОРОШО echo("Вилка ок"); продолжать; } иначе, если ($pid < 0) { echo("Ошибка вилки"); продолжать; } Еще перерыв; } } Пока (истина); // Делаем что-нибудь с новым подключенным клиентом...
Есть идеи? Спасибо!
Я разрабатываю сервер веб-сокетов SSL, PHP 8.2.
Я без проблем принимаю SSL-соединения.
Проблема:
Принимаются соединение A, затем B, затем C, затем D.
Когда соединение C закрывается (отключение совершают клиенты, а не сервер), то соединения A и B неожиданно закрываются (но не D).
При выполнении операции "fread" в сокете потока A или B будет выдано следующее предупреждение: fread(): операция SSL не удалась с кодом 1. Сообщения об ошибках OpenSSL: ошибка: 140943FC: процедуры SSL: ssl3_read_bytes: предупреждение sslv3 о плохой записи Mac в....
Чтение через сокет D будет продолжаться.
Это происходит только при SSL-соединениях, а не при незашифрованных соединениях.
Фактически, все сокеты, открытые ДО закрывающегося сокета, также закрываются.
Пример моего кода:
$транспорт = 'tlsv1.3'; $ssl = ['ssl' => [ 'local_cert' => $sslCert, 'local_pk' => $sslKey, 'disable_compression' => true, 'verify_peer' => ложь, 'allow_self_signed' => правда, 'ssltransport' => $транспорт, ] ]; $context =stream_context_create($ssl); $socketS =stream_socket_server( 'ssl://0.0.0.0:'.$wssPort, $ошибка, $ошибка, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $контекст ); .... делать { $tCpy = массив ($socketS); $retSocket=stream_select($tCpy, $null, $null, 20, 0); если ($retSocket>0 ) { // Новое соединение stream_set_blocking($socketS, правда); $cliSocket =stream_socket_accept($socketS,5,$ip); ... $pid = pcntl_fork(); если ($pid>0) { // ХОРОШО echo("Вилка ок"); продолжать; } иначе, если ($pid < 0) { echo("Ошибка вилки"); продолжать; } Еще перерыв; } } Пока (истина); // Делаем что-нибудь с новым подключенным клиентом...
Есть идеи? Спасибо!
Мобильная версия