LINUX.ORG.RU

Наследование от QTcpSocket

 


0

2

Добрый день. Решил попробовать написать TCP сервер на Qt. За пример взял данную статью: https://habrahabr.ru/post/131472/

Там создается мапник со списком подключенных клиентов, указатели на объекты QTcpSocket. Но я хочу в этом мапнике хранить еще индивидуальную инфу по каждому клиенту, например, его айпи адрес, в общем, некие данные уникальные для каждого клиента. Наследоваться от QTcpSocket нельзя, потому что вызов методов nextPendingConnection() и sender() - в слоте получения данных по сокету возвращают QTcpSocket, а привезти этот тип к наследованному нельзя. Думал, определить свой класс свойством которого был бы объект типа QTcpSocket и при новом коннекте создавать этот объект, в его свойство прописывать уже объект QTcpSocket и уже этот (свой) класс добавлять в мапник. Но как-то уже сильно громозко вроде как получается. Кто что может посоветовать?

Наследование тебе не подходит (я так и не понял, почему), используй инкапсуляцию.

PPP328 ★★★★★
()
Ответ на: комментарий от PPP328

Ну смотри, вызывается слот нового подключения, в нем мы получаем с помощью метода nextPendingConnection объект QTcpSocket для нового клиента. Мне нужно где-то хранить его, я добавляю его не в мапник (как товарищ выше заметил), а в объект QMap. Но ко всему прочему мне нужно где-то хранить уникальные для каждого клиента данные, его айпи, например. Если я унаследуюсь от QTcpSocket, то я не смогу использовать приведение типов от QTcpSocket в его наследника.

hell_wood
() автор топика
Ответ на: комментарий от PPP328

Т.е сделать свой класс одним и свойств которого был бы тот самый объект QTcpSocket? И этот свой класс и хранить в коллекции QMap?

hell_wood
() автор топика
class Client : public QObject
{
    Q_OBJECT
public:
    Client(QTcpSocket* tcp)
    {
        this->tcp = tcp;
        connect(tcp,&QTcpSocket::disconnected,this,&Client::disc,Qt::QueuedConnection);
        connect(tcp,&QTcpSocket::readyRead,this,&Client::readTcp,Qt::QueuedConnection);
    }
    ~Client()
    {
        if(!tcp.isNull())
        {
             tcp->deleteLater();
        }
    }
private slots:
    void readTcp()
    {
        if(tcp.isNull()) return;
        tcp->readAll();
    }
signals:
    void disc();
private:
    QPointer<QTcpSocket> tcp;
};

class Server : public QObject
{
    Q_OBJECT
public:
    Server();
    ~Server();
private slots:
    void newConnection()
    {
        if(serv.isNull()) return;
        while(serv->hasPendingConnections())
        {
            QTcpSocket* sock = serv->nextPendingConnection();
            if(sock != 0)
            {
                Client* client = new Client(sock);
                connect(client,&Client::disc,this,&VPrmServer::clientDisconnected,Qt::QueuedConnection);
                clients.append(client);
            }
        }
    }
    void clientDisconnected()
    {
        QObject* sender = this->sender();
        if(sender == 0) return;
        clients.removeAll((qobject_cast<Client*>(sender)));
        delete sender;
    }
private:
    QPointer<QTcpServer> serv;
    QList<Client*> clients;
};
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.