Russian Qt Forum
Март 29, 2024, 12:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Еще раз про QServerSocket  (Прочитано 11326 раз)
west
Гость
« : Январь 24, 2005, 15:55 »

Как решить такую задачу: работает серверное приложение на определенном порту и IP адресе. Запускается второе серверное приложение, никак ни связанное с работающем на этом же порту и IP адресе. Как сделать так, чтобы второе завалило первое, или хотя бы отключило его от сети и само село на уазанный порт?
Записан
Sergeich
Гость
« Ответ #1 : Январь 24, 2005, 18:39 »

Задачу можно разбить на две:
1. Определить запущено ли серверное приложение
2. Если запущено, то грохнуть его

1. а) if ( ! QSocket::connect( host, port ) ) { ... }
    б) QServerSocket*  ss= new QServerSocket(..., host, port )
        if ( !ss->ok() ) {
         ss->deleteLater();
         ....
       }
    в) Средствами ОС : через ps под nix, toolhelp32 под виндой
2. а) Предусматриваем в протоколе некое ключевое слово чтобы остановить сервер и в реализации сервера пишем что-то типа
  if ( keyword == "HALT" ) {
    ... // prepare to close
    QApplication::quit();
  }    
    б) Определяем PID процесса и грохаем его через kill или TerminateProcess

Лучше всего реализовать вариант а).
Записан
west
Гость
« Ответ #2 : Январь 25, 2005, 12:03 »

С завалом всего комплекса получилось, а вот сесть потом на его  IP и Port не очень. То же самое при применениии метода deleteLater. Может библиотека Qt cтарая - 2.3.0? Как , кстати, должен проявить себя метод  deleteLater()? И нужно ли после его применения занова инициализировать сервер. Я делаю вот так:

1) Наследую QServerSocket

class CP_Server : public QServerSocket
{
   Q_OBJECT
public:
   CP_Server(QHostAddress &adress, int port, QObject* parent = 0,const char* name = 0);
   ~CP_Server();
private:
   void newConnection( int socket );
  //
  //
  //
}

2) Инициализирую CP_Server:

bool MyClass::initServer()
{
  //..............................................
    m_pServer = new CP_Server(hostAdress,port,0,stServer[1]);
    if(!m_pServer->ok())
        m_pServer->deleteLater();
    return m_pServer->ok();
}

Возвращает false. Чего делать-то, подскажите плз.
Записан
Sergeich
Гость
« Ответ #3 : Январь 25, 2005, 14:36 »

Цитировать
Может библиотека Qt cтарая - 2.3.0?

Библиотеку надо бы сменить на 3.3.3...
Цитировать
Как , кстати, должен проявить себя метод deleteLater()?

deleteLater() просто грамотно удаляет QObject ( см. доку )
Цитировать
И нужно ли после его применения занова инициализировать сервер.

  После того как ты грохнул первый сервер, заведи таймер и попытайся
по нему инициализировать сервер... Похоже что после того как ты валишь сервер должно пройти какое-то время чтобы серверный сокет удалился из таблицы дескрипторов

 А вообще что за задача? Зачем валить работающий сервер? Без этого нельзя?
Записан
west
Гость
« Ответ #4 : Январь 25, 2005, 16:46 »

Да задача-то все старая, я по ней уже интересовался на форуме. Проблема в том, что если валится серверное приложение, при повторном запуске (сразу же) выдается ошибка QServerSocket::faild to bind or listen to the socket. Просто на старую тему уже никто не реагирует, а проблема не решена. По смыслу проблемма - та же - освободить занятый сокет. В целом задача выглядит так: Кластерная платформа из N-количества вычислительных модулей, каждый из которых работает естесственно на своей машине.  Аппаратная часть отечественная, вычисления достаточно сложные и объемные. В рабочей конфигурации вычислительные модули работают без мониторов и клавиатур. Если при вычислении что-то валится, или виснет (а и то и то возможно по Т.З.), должен быть автоматом перезапущен комплекс и соответственно начать предоставлять серверные услуги. Ну и юзер будет очень глуп, про то чтобы чего-то там убить ручками или что-то сделать толковое - не может быть и речи.  Время на перезапуск естесственно ограниченно. Вот такая вот штука.
Записан
Sergeich
Гость
« Ответ #5 : Январь 25, 2005, 17:49 »

Отдели вычислительные модули от сервера. Т.е сделай сервер который запускает вычислительные модули ( скажем через QProcess )
и следит за их состоянием, а при необходимости их перезапускает.
Т.е. схема такая : сначала запускается общий сервер, к-ый должен работать абсолютно надежно, затем он запускает вычислительные модули, к-ые коннектятся к серверу и общаются с ним по сокету. Если что-нить валится, сервер мочит все модули, а потом перезапускает.
Записан
west
Гость
« Ответ #6 : Январь 25, 2005, 18:39 »

Возможно я не так объясняю. Сервер - станция предоставляющая услуги, клиент - ими пользующийся. В случае описанной выше системы я имел ввиду, что серверами являются как раз вычислительные модули, предоставляющие услуги по математическим расчетам. (В них до хрена всяких алгоритмов). Клиент - собственно АРМ и оператор за ним - подключается к н-му количеству математических серверов и распихивает каждому по куску одной большой задачи. К каждому математическому серверу может быть подключено несколько клиентов - раздавальщиков задач. Если математику отцепить от сетки, придется заниматься передачей данных на уровне клиент-сервер и сервер-математика.  На уровне локальной машины это просто реализовать, но при больших объемах исходных данных это потеря времени, и существенная.
Записан
Sergeich
Гость
« Ответ #7 : Январь 25, 2005, 19:45 »

Вообще-то я предлагаю завести еще один процесс ( обзовем его "диспетчер" ), имеющий серверный сокет и контролирующий математические сервера. Т.е. математические сервера будут являтся клиентами "диспетчера".
Записан
west
Гость
« Ответ #8 : Январь 26, 2005, 10:35 »

Ну да, что-то типа такого и планируется в итоге сделать. Будет прога, контролирующая работу математических серверов на каждом вычислительном модуле. Сама задача просто в мозгу сидит (про отключение сервера), хочется разобраться, как это сделать. Функция deleteLater() в моем хелпе по Qt 2.3.0 не описана. Хотя как метод QObject компилится. Только в представленном мною выше коде она ни как себя не проявляет. Т.е. запущенно приложение, запуск точно такого же с такими же параметрами начего с первым не делает, хотя метод deleteLater() вызывается. Чего может быть не таk :?:  Sergeich: спасибо за внимание, надеюсь на продолжение. Крутой
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.075 секунд. Запросов: 20.