Russian Qt Forum
Ноябрь 22, 2024, 08:24
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Работа с сетью
>
Еще раз про QServerSocket
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Еще раз про QServerSocket (Прочитано 11724 раз)
west
Гость
Еще раз про QServerSocket
«
:
Январь 24, 2005, 15:55 »
Как решить такую задачу: работает серверное приложение на определенном порту и IP адресе. Запускается второе серверное приложение, никак ни связанное с работающем на этом же порту и IP адресе. Как сделать так, чтобы второе завалило первое, или хотя бы отключило его от сети и само село на уазанный порт?
Записан
Sergeich
Гость
Еще раз про QServerSocket
«
Ответ #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
Гость
Еще раз про QServerSocket
«
Ответ #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
Гость
Еще раз про QServerSocket
«
Ответ #3 :
Январь 25, 2005, 14:36 »
Цитировать
Может библиотека Qt cтарая - 2.3.0?
Библиотеку надо бы сменить на 3.3.3...
Цитировать
Как , кстати, должен проявить себя метод deleteLater()?
deleteLater() просто грамотно удаляет QObject ( см. доку )
Цитировать
И нужно ли после его применения занова инициализировать сервер.
После того как ты грохнул первый сервер, заведи таймер и попытайся
по нему инициализировать сервер... Похоже что после того как ты валишь сервер должно пройти какое-то время чтобы серверный сокет удалился из таблицы дескрипторов
А вообще что за задача? Зачем валить работающий сервер? Без этого нельзя?
Записан
west
Гость
Еще раз про QServerSocket
«
Ответ #4 :
Январь 25, 2005, 16:46 »
Да задача-то все старая, я по ней уже интересовался на форуме. Проблема в том, что если валится серверное приложение, при повторном запуске (сразу же) выдается ошибка QServerSocket::faild to bind or listen to the socket. Просто на старую тему уже никто не реагирует, а проблема не решена. По смыслу проблемма - та же - освободить занятый сокет. В целом задача выглядит так: Кластерная платформа из N-количества вычислительных модулей, каждый из которых работает естесственно на своей машине. Аппаратная часть отечественная, вычисления достаточно сложные и объемные. В рабочей конфигурации вычислительные модули работают без мониторов и клавиатур. Если при вычислении что-то валится, или виснет (а и то и то возможно по Т.З.), должен быть автоматом перезапущен комплекс и соответственно начать предоставлять серверные услуги. Ну и юзер будет очень глуп, про то чтобы чего-то там убить ручками или что-то сделать толковое - не может быть и речи. Время на перезапуск естесственно ограниченно. Вот такая вот штука.
Записан
Sergeich
Гость
Еще раз про QServerSocket
«
Ответ #5 :
Январь 25, 2005, 17:49 »
Отдели вычислительные модули от сервера. Т.е сделай сервер который запускает вычислительные модули ( скажем через QProcess )
и следит за их состоянием, а при необходимости их перезапускает.
Т.е. схема такая : сначала запускается общий сервер, к-ый должен работать абсолютно надежно, затем он запускает вычислительные модули, к-ые коннектятся к серверу и общаются с ним по сокету. Если что-нить валится, сервер мочит все модули, а потом перезапускает.
Записан
west
Гость
Еще раз про QServerSocket
«
Ответ #6 :
Январь 25, 2005, 18:39 »
Возможно я не так объясняю. Сервер - станция предоставляющая услуги, клиент - ими пользующийся. В случае описанной выше системы я имел ввиду, что серверами являются как раз вычислительные модули, предоставляющие услуги по математическим расчетам. (В них до хрена всяких алгоритмов). Клиент - собственно АРМ и оператор за ним - подключается к н-му количеству математических серверов и распихивает каждому по куску одной большой задачи. К каждому математическому серверу может быть подключено несколько клиентов - раздавальщиков задач. Если математику отцепить от сетки, придется заниматься передачей данных на уровне клиент-сервер и сервер-математика. На уровне локальной машины это просто реализовать, но при больших объемах исходных данных это потеря времени, и существенная.
Записан
Sergeich
Гость
Еще раз про QServerSocket
«
Ответ #7 :
Январь 25, 2005, 19:45 »
Вообще-то я предлагаю завести еще один процесс ( обзовем его "диспетчер" ), имеющий серверный сокет и контролирующий математические сервера. Т.е. математические сервера будут являтся клиентами "диспетчера".
Записан
west
Гость
Еще раз про QServerSocket
«
Ответ #8 :
Январь 26, 2005, 10:35 »
Ну да, что-то типа такого и планируется в итоге сделать. Будет прога, контролирующая работу математических серверов на каждом вычислительном модуле. Сама задача просто в мозгу сидит (про отключение сервера), хочется разобраться, как это сделать. Функция deleteLater() в моем хелпе по Qt 2.3.0 не описана. Хотя как метод QObject компилится. Только в представленном мною выше коде она ни как себя не проявляет. Т.е. запущенно приложение, запуск точно такого же с такими же параметрами начего с первым не делает, хотя метод deleteLater() вызывается. Чего может быть не таk :?: Sergeich: спасибо за внимание, надеюсь на продолжение.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...