Постоянное TCP-соединение с XMPP-сервером

iNfantry

Новичок
Всем привет, подскажите нормальный человеческий способ держать установленное соединение, и в случае если происходит разрыв по какой-то причине, то определить что он произошел. Конкретно в моем случае речь идет о xmpp(jabber)-клиенте, всё работает нормально, подключение, прием/отправка сообщений, авторизация и тд, вопрос только в том, что соединение через какое-то время рвется и я не знаю как это отследить.

PHP:
function getxml($stream)
{
    sleep(1); // перед получением информации дадим паузу, чтобы сервер успел отдать информацию
    $xml = '';

    // запрашивать данные 1600 раз, но не более 15 пустых строк
    $empty_line = 0;
    for ($i=0; $i<1600; $i++) {
        $line = fread($stream, 2048);
        if (strlen($line) == 0) {
            $empty_line++;
            if ($empty_line > 15) {
                break;
            }
        }
        else {
            $xml .= $line;
        }
    }
    if (!$xml) {
        return false;
    }
    return $xml;
}


// устанавливаем соединение с сервером
$stream = fsockopen($host, $port, $errorno, $errorstr, 10);

// эти настройки необходимы, чтобы при получении данных из потока не было зависания.
// иначе при обнаружении пустой строки php зависнет в длительном ожидании
stream_set_blocking($stream, 0);
stream_set_timeout($stream, 3600*24);

... //отправка и получение всех необходимых данных для авторизации и выхода в онлайн

while (true)
{
    sleep(3); // ставим паузу в 3 секунды, чтобы не создавать большую нагрузку на php
    $xmlin = getxml($stream); // и раз в 3 секунды идет сбор данных из потока. тут будут приходить сообщения, информация о смене статусов ваших контактов и т.д.
    if (strlen($xmlin))
    {
        ... //обрабатываем входящие пакеты
        //здесь надо както узнать, не произошел ли разрыв связи
    }
}
 
Сверху