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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как привязать таймер к конкретному объекту.  (Прочитано 2414 раз)
demiurg
Гость
« : Июнь 28, 2011, 21:27 »

Делаю TCP сервер, к которому хочу прицепить защиту на таймерах. Т.е. если например подключение осуществилось, а идентификаторовов протокола не обнаружено в течении 10 секунд, то клиента рубит. Аналогично, запрет на повторные подключения от когото айпи в течении 10 минут. Вопрос в том как мне QTimer прикрутить к конкретному айпи? Т.е. сработал например таймер1 - отключаю такогото клиента, таймер2 - другого.  Или использовать Qtimer ресурсоёмко?Подскажите пожалуйста как лучше реализовать ? 
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Июнь 28, 2011, 22:03 »

QTimer::singleShot
Записан
demiurg
Гость
« Ответ #2 : Июнь 28, 2011, 22:33 »

Код:
void Server::addConnection()
{

    QTcpSocket *client = nextPendingConnection();
    connect(client, SIGNAL(disconnected()),
            this, SLOT(removeConnection()));
    connect(client, SIGNAL(readyRead()), this,  SLOT(onRead()));
    connect(client, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SLOT(displayError(QAbstractSocket::SocketError)));
    client->write(QTextCodec::codecForLocale()->fromUnicode(
                         QObject::tr("Hello! Привет!") + 0x0d+0x0a ) );
    QHostAddress addr = client->peerAddress();
    cout << STR(QObject::tr("Подключился новый клиент с адреса %1\n")
                         .arg( addr.toString() ));
    BL.insert(client,"");
    AL.insert(client,0);
    m_clients.append(client);
    QTimer timer;
    //timer.singleShot(10000,this,this->removeConnection());
    timer.singleShot(10000,this,this->timer_close(client));
}

void Server::timer_close(QTcpSocket *socket)
{
    if (AL.value(socket)==0)
    {
    socket->close();
    socket->flush();
    socket->close();
    m_clients.removeOne(socket);
    BL.remove(socket);
    socket->deleteLater();
    }
}

выводит
Код:
D:/Qt/server/server.cpp:74: error: invalid use of void expression
строчка на
Код:
"timer.singleShot(10000,this,this->timer_close(client));"
В чём фишка? Сразу извиняюсь за тупые вопросы, в ООП не силён , пишу в основном в asme и С под контроллеры - решил освоить чтото новое.
И ещё вопрос  - получается для каждого клиента будет свой таймер? Или же один на все?

« Последнее редактирование: Июнь 28, 2011, 23:16 от demiurg » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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