Есть у меня задача - принимать 2 потока от кодировщиков и, в зависимоти от условий, передавать один из них icecast'у (сервер интернет-радио).
Один поток от удаленного кодировщика (вроде ретрансляции), если он пропал - переключаться на другой поток (резервный, от локального кодировщика). А на выходе icecast не должен замечать подмены.
Сейчас для всего этого используется 4 скрипта: первый создает кусок памяти shmop_open() для буфера, и запускает 2 скрипта как отдельные процессы (для приема потоков от кодировщиков и записи их в буфер) и еще один отдельный для чтения из буфера и выдачи серваку.
Это все работает нормально, переключаться - переключается, но при кратковременном обрыве связи от одного из кодировщиков, кодировщик (клиент) пытается переподключиться, а сокет более не реагирует, т.к. он уже открыт.
Код
$server = stream_socket_server('tcp://91.196.228.82:8000');
$socket = stream_socket_accept($server);
fwrite($socket, $greeting); //send headers
while(true){
usleep(10000);
buf_r(); //read from $sock into shared buf.
$status = stream_get_meta_data($socket);
if($status['eof']){
//reaccept
fclose($socket);
$socket = stream_socket_accept($server);
fwrite($socket, $greeting);
}
}
/* Close it up */
fclose($socket);
fclose($server);
$socket = stream_socket_accept($server);
fwrite($socket, $greeting); //send headers
while(true){
usleep(10000);
buf_r(); //read from $sock into shared buf.
$status = stream_get_meta_data($socket);
if($status['eof']){
//reaccept
fclose($socket);
$socket = stream_socket_accept($server);
fwrite($socket, $greeting);
}
}
/* Close it up */
fclose($socket);
fclose($server);
и вот эта часть не работает
Код
$status = stream_get_meta_data($socket);
if($status['eof']){
//reaccept
fclose($socket);
$socket = stream_socket_accept($server);
fwrite($socket, $greeting);
}
if($status['eof']){
//reaccept
fclose($socket);
$socket = stream_socket_accept($server);
fwrite($socket, $greeting);
}
Посоветуйте, как его заставить работать?
Спустя 9 дней, 19 часов, 15 минут, 41 секунда (24.10.2008 - 13:05) bearman написал(а):
а соединения вещь такая, пока не попытаешься прочитать из него, он не поймет ЕОФ или нет, другими словами get_eta_data бесполезно вызывать если перед этим не делать нечто вида socket_read
