Okay... I had doubts whether I'm doing it right. I think the Qt documentation confuses more than it helps. 
I've moved the QTcpServer in an extra thread... This way was easier.
Here's the final version of the MyServer class:
myserver.h
#ifndef MYSERVER_H
#define MYSERVER_H
#include <QObject>
#include <QtNetwork/QTcpServer>
#include "myclienthandle.h"
{
Q_OBJECT
public:
explicit MyServer(const MyServer &server);
~MyServer();
unsigned short Port() const;
void setPort(unsigned short port);
bool isRunning() const;
private:
unsigned short m_iPort;
bool m_bRunning;
void init
(const QHostAddress &address,
unsigned short port
);
signals:
void clientConnected(int socketDescriptor);
void startError();
public slots:
void start();
void stop();
void m_qtcpserListener_newConnection();
};
{
return *m_qhaddAddress;
}
inline void MyServer
::setAddress(const QHostAddress &address
) {
}
inline unsigned short MyServer::Port() const
{
return m_iPort;
}
inline void MyServer::setPort(unsigned short port)
{
m_iPort = port;
}
inline bool MyServer::isRunning() const
{
return m_bRunning;
}
inline void MyServer::m_qtcpserListener_newConnection()
{
emit clientConnected(m_qtcpserListener->nextPendingConnection()->socketDescriptor());
}
#endif // MYSERVER_H
#ifndef MYSERVER_H
#define MYSERVER_H
#include <QObject>
#include <QtNetwork/QTcpServer>
#include "myclienthandle.h"
class MyServer : public QObject
{
Q_OBJECT
public:
explicit MyServer(const QHostAddress &address = QHostAddress::Any, unsigned short port = 0, QObject *parent = 0);
explicit MyServer(const MyServer &server);
~MyServer();
QHostAddress Address() const;
void setAddress(const QHostAddress &address);
unsigned short Port() const;
void setPort(unsigned short port);
bool isRunning() const;
private:
QTcpServer *m_qtcpserListener;
QHostAddress *m_qhaddAddress;
QThread *m_qthServer;
unsigned short m_iPort;
bool m_bRunning;
void init(const QHostAddress &address, unsigned short port);
signals:
void clientConnected(int socketDescriptor);
void startError();
public slots:
void start();
void stop();
void m_qtcpserListener_newConnection();
};
inline QHostAddress MyServer::Address() const
{
return *m_qhaddAddress;
}
inline void MyServer::setAddress(const QHostAddress &address)
{
m_qhaddAddress = new QHostAddress(address);
}
inline unsigned short MyServer::Port() const
{
return m_iPort;
}
inline void MyServer::setPort(unsigned short port)
{
m_iPort = port;
}
inline bool MyServer::isRunning() const
{
return m_bRunning;
}
inline void MyServer::m_qtcpserListener_newConnection()
{
emit clientConnected(m_qtcpserListener->nextPendingConnection()->socketDescriptor());
}
#endif // MYSERVER_H
To copy to clipboard, switch view to plain text mode
myserver.cpp
#include "myserver.h"
{
init(address, port);
}
MyServer::MyServer(const MyServer &server) :
QObject(server.
parent()), m_bRunning
(false) {
init(server.Address(), server.Port());
}
MyServer::~MyServer()
{
stop();
delete m_qtcpserListener;
delete m_qthServer;
}
void MyServer
::init(const QHostAddress &address,
unsigned short port
) {
setAddress(address);
setPort(port);
connect(m_qtcpserListener, SIGNAL(newConnection()),
this, SLOT(m_qtcpserListener_newConnection()),
Qt::DirectConnection);
m_qtcpserListener->moveToThread(m_qthServer);
}
void MyServer::start()
{
m_qtcpserListener->thread()->start();
m_qtcpserListener->thread()->setObjectName(tr("Listeners Thread"));
if (!m_qtcpserListener->listen(Address(), Port()))
{
stop();
emit startError();
} else {
m_bRunning = true;
}
}
void MyServer::stop()
{
m_bRunning = false;
if (m_qtcpserListener->isListening())
{
m_qtcpserListener->close();
}
m_qtcpserListener->thread()->quit();
m_qtcpserListener->thread()->wait();
}
#include "myserver.h"
MyServer::MyServer(const QHostAddress &address, unsigned short port, QObject *parent) :
QObject(parent), m_bRunning(false)
{
init(address, port);
}
MyServer::MyServer(const MyServer &server) :
QObject(server.parent()), m_bRunning(false)
{
init(server.Address(), server.Port());
}
MyServer::~MyServer()
{
stop();
delete m_qtcpserListener;
delete m_qthServer;
}
void MyServer::init(const QHostAddress &address, unsigned short port)
{
m_qtcpserListener = new QTcpServer;
m_qthServer = new QThread(this);
setAddress(address);
setPort(port);
connect(m_qtcpserListener, SIGNAL(newConnection()),
this, SLOT(m_qtcpserListener_newConnection()),
Qt::DirectConnection);
m_qtcpserListener->moveToThread(m_qthServer);
}
void MyServer::start()
{
m_qtcpserListener->thread()->start();
m_qtcpserListener->thread()->setObjectName(tr("Listeners Thread"));
if (!m_qtcpserListener->listen(Address(), Port()))
{
stop();
emit startError();
} else {
m_bRunning = true;
}
}
void MyServer::stop()
{
m_bRunning = false;
if (m_qtcpserListener->isListening())
{
m_qtcpserListener->close();
}
m_qtcpserListener->thread()->quit();
m_qtcpserListener->thread()->wait();
}
To copy to clipboard, switch view to plain text mode
Bookmarks