Название: Еще раз про QServerSocket Отправлено: west от Январь 24, 2005, 15:55 Как решить такую задачу: работает серверное приложение на определенном порту и IP адресе. Запускается второе серверное приложение, никак ни связанное с работающем на этом же порту и IP адресе. Как сделать так, чтобы второе завалило первое, или хотя бы отключило его от сети и само село на уазанный порт?
Название: Еще раз про QServerSocket Отправлено: Sergeich от Январь 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 Лучше всего реализовать вариант а). Название: Еще раз про QServerSocket Отправлено: west от Январь 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. Чего делать-то, подскажите плз. Название: Еще раз про QServerSocket Отправлено: Sergeich от Январь 25, 2005, 14:36 Цитировать Может библиотека Qt cтарая - 2.3.0? Библиотеку надо бы сменить на 3.3.3... Цитировать Как , кстати, должен проявить себя метод deleteLater()? deleteLater() просто грамотно удаляет QObject ( см. доку ) Цитировать И нужно ли после его применения занова инициализировать сервер. После того как ты грохнул первый сервер, заведи таймер и попытайся по нему инициализировать сервер... Похоже что после того как ты валишь сервер должно пройти какое-то время чтобы серверный сокет удалился из таблицы дескрипторов А вообще что за задача? Зачем валить работающий сервер? Без этого нельзя? Название: Еще раз про QServerSocket Отправлено: west от Январь 25, 2005, 16:46 Да задача-то все старая, я по ней уже интересовался на форуме. Проблема в том, что если валится серверное приложение, при повторном запуске (сразу же) выдается ошибка QServerSocket::faild to bind or listen to the socket. Просто на старую тему уже никто не реагирует, а проблема не решена. По смыслу проблемма - та же - освободить занятый сокет. В целом задача выглядит так: Кластерная платформа из N-количества вычислительных модулей, каждый из которых работает естесственно на своей машине. Аппаратная часть отечественная, вычисления достаточно сложные и объемные. В рабочей конфигурации вычислительные модули работают без мониторов и клавиатур. Если при вычислении что-то валится, или виснет (а и то и то возможно по Т.З.), должен быть автоматом перезапущен комплекс и соответственно начать предоставлять серверные услуги. Ну и юзер будет очень глуп, про то чтобы чего-то там убить ручками или что-то сделать толковое - не может быть и речи. Время на перезапуск естесственно ограниченно. Вот такая вот штука.
Название: Еще раз про QServerSocket Отправлено: Sergeich от Январь 25, 2005, 17:49 Отдели вычислительные модули от сервера. Т.е сделай сервер который запускает вычислительные модули ( скажем через QProcess )
и следит за их состоянием, а при необходимости их перезапускает. Т.е. схема такая : сначала запускается общий сервер, к-ый должен работать абсолютно надежно, затем он запускает вычислительные модули, к-ые коннектятся к серверу и общаются с ним по сокету. Если что-нить валится, сервер мочит все модули, а потом перезапускает. Название: Еще раз про QServerSocket Отправлено: west от Январь 25, 2005, 18:39 Возможно я не так объясняю. Сервер - станция предоставляющая услуги, клиент - ими пользующийся. В случае описанной выше системы я имел ввиду, что серверами являются как раз вычислительные модули, предоставляющие услуги по математическим расчетам. (В них до хрена всяких алгоритмов). Клиент - собственно АРМ и оператор за ним - подключается к н-му количеству математических серверов и распихивает каждому по куску одной большой задачи. К каждому математическому серверу может быть подключено несколько клиентов - раздавальщиков задач. Если математику отцепить от сетки, придется заниматься передачей данных на уровне клиент-сервер и сервер-математика. На уровне локальной машины это просто реализовать, но при больших объемах исходных данных это потеря времени, и существенная.
Название: Еще раз про QServerSocket Отправлено: Sergeich от Январь 25, 2005, 19:45 Вообще-то я предлагаю завести еще один процесс ( обзовем его "диспетчер" ), имеющий серверный сокет и контролирующий математические сервера. Т.е. математические сервера будут являтся клиентами "диспетчера".
Название: Еще раз про QServerSocket Отправлено: west от Январь 26, 2005, 10:35 Ну да, что-то типа такого и планируется в итоге сделать. Будет прога, контролирующая работу математических серверов на каждом вычислительном модуле. Сама задача просто в мозгу сидит (про отключение сервера), хочется разобраться, как это сделать. Функция deleteLater() в моем хелпе по Qt 2.3.0 не описана. Хотя как метод QObject компилится. Только в представленном мною выше коде она ни как себя не проявляет. Т.е. запущенно приложение, запуск точно такого же с такими же параметрами начего с первым не делает, хотя метод deleteLater() вызывается. Чего может быть не таk :?: Sergeich: спасибо за внимание, надеюсь на продолжение. 8)
|