Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demiurg от Июня 28, 2011, 21:27



Название: Как привязать таймер к конкретному объекту.
Отправлено: demiurg от Июня 28, 2011, 21:27
Делаю TCP сервер, к которому хочу прицепить защиту на таймерах. Т.е. если например подключение осуществилось, а идентификаторовов протокола не обнаружено в течении 10 секунд, то клиента рубит. Аналогично, запрет на повторные подключения от когото айпи в течении 10 минут. Вопрос в том как мне QTimer прикрутить к конкретному айпи? Т.е. сработал например таймер1 - отключаю такогото клиента, таймер2 - другого.  Или использовать Qtimer ресурсоёмко?Подскажите пожалуйста как лучше реализовать ? 


Название: Re: Как привязать таймер к конкретному объекту.
Отправлено: LisandreL от Июня 28, 2011, 22:03
QTimer::singleShot


Название: Re: Как привязать таймер к конкретному объекту.
Отправлено: demiurg от Июня 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 и С под контроллеры - решил освоить чтото новое.
И ещё вопрос  - получается для каждого клиента будет свой таймер? Или же один на все?