Здравствуйте решил написать многопоточный сервер на qudpsocket
для начала задача проста сервер принимает сообщение от клиента в основном потоке, потом запускает qrunable из пула потока и шлет ответное сообщение в таске
вот код
main.cpp
C++ (Qt)
#include <QCoreApplication>
#include "udpserver.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
udpserver serv;
// serv.startserver();
return a.exec();
}
udpserver.h
C++ (Qt)
#ifndef UDPSERVER_H
#define UDPSERVER_H
#include <QObject>
#include "mytask.h"
#include <QUdpSocket>
#include <QThreadPool>
#include <QDebug>
class udpserver : public QObject
{
Q_OBJECT
public:
explicit udpserver(QObject *parent = 0);
QUdpSocket *servsock=nullptr;
public slots:
void startserver();
void readyreadclient();
};
udpserver.cpp
C++ (Qt)
#include "udpserver.h"
udpserver::udpserver(QObject *parent) : QObject(parent)
{
servsock=new QUdpSocket();
servsock->bind(QHostAddress("127.0.0.1"),43620,QUdpSocket::ReuseAddressHint);
connect(servsock,SIGNAL(readyRead()),this,SLOT(readyreadclient()));
}
void udpserver::startserver()
{
}
void udpserver::readyreadclient()
{
while (servsock->hasPendingDatagrams())
{
QByteArray sb;
quint64 size=servsock->pendingDatagramSize();
sb.resize(size);
QHostAddress adrcli;
quint16 portcli;
servsock->readDatagram(sb.data(),size,&adrcli,&portcli);
qDebug()<<sb;
int desc=servsock->socketDescriptor();
mytask *mt=new mytask(adrcli,portcli,desc);
mt->setAutoDelete(true);
QThreadPool::globalInstance()->start(mt);
}
}
mytask.h
C++ (Qt)
#ifndef MYTASK_H
#define MYTASK_H
#include <QObject>
#include <QRunnable>
#include <QHostAddress>
#include <QUdpSocket>
class mytask : public QObject, public QRunnable
{
Q_OBJECT
public:
explicit mytask(QHostAddress,quint16,int,QObject *parent = nullptr);
~mytask();
QHostAddress adressclient;
quint16 portcli;
QUdpSocket *sockrab;
int nativdesc;
signals:
public slots:
protected:
void run();
};
#endif // MYTASK_H
mytask.cpp
C++ (Qt)
#include "mytask.h"
mytask::mytask(QHostAddress adrcl,quint16 pt,int dsc,QObject *parent) : QObject(parent)
{
adressclient=QHostAddress(adrcl);
portcli=pt;
nativdesc=dsc;
}
mytask::~mytask()
{
if (sockrab)
{
sockrab->deleteLater();
}
}
void mytask::run()
{
sockrab=new QUdpSocket();
sockrab->setSocketDescriptor(nativdesc);
QByteArray sb="OT SERVER PRIVET";
quint64 sz=sb.size();
sockrab->writeDatagram(sb,sb.size(),adressclient,portcli);
}
С клиента я посылаю сообщение потом жду ответа от сервера а затем клиент завершает работу
Проблема заключается в том что когда выполняется
C++ (Qt)
if (sockrab)
{
sockrab->deleteLater();
}
по логике это вроде правильно чтобы не было утечек
но со временем сервер просто перестает отвечать
C++ (Qt)
QSocketNotifier: Invalid socket 6 and type 'Read', disabling...
в случае если этот блок кода убрать то сервер работает нормально
как можно решить данную проблему? qt 4.8