开发者

I just cannot get QTcpServer working (newConnection never called)

开发者 https://www.devze.com 2023-03-10 20:27 出处:网络
I know similar question to this have been asked, but I haven\'t found an answer that fixes my problem.

I know similar question to this have been asked, but I haven't found an answer that fixes my problem.

I'm adapting some exi开发者_运维问答sting Qt code to add server functionality to a program my company uses. To that end I added a QTcpServer object to the existing dialog, call listen() and connect a slot to the newConnection emitter, like:

    .h
    class QConsole : public QDialog
    {
    Q_OBJECT
    public:
        void init();
    public slots:
        void new_Connection();
    private:
        QTcpServer m_Server;
    }

    .cpp
    void QConsole::init()
    {
        m_Server.listen(QHostAddress::Any, 12346);
        QDialog::connect(&m_Server, SIGNAL(newConnection()), this, SLOT(new_Connection()));
    }

Main is:

    int main( int argc, char *argv[] )
    {
        QApplication app(argc, argv);
        QConsole * _output_window = new QConsole(desktopRect);
        _output_window->init();
        _output_window->show();

    return app.exec();
    }

new_Connection() never gets called so I can't see the relevance, but here it is:

   void QConsole::new_Connection()
   {
   }

This works fine in that my program starts listening on the port specified and if I telnet to it a connection of sorts it made, but new_Connection() is never ever ever called!

I've seen posts on this problem dating back to 2005 so it's obviously not a new thing, but what I haven't found is a satisfactory answer to the problem (or any answer actually). This has got everyone at work stumped, even the person that has written a Qt server program. I'm guessing that there is something fundamentally wrong with the existing framework, but I have no idea what it might be.

I have been tearing my hair out for a day and a half over this, and the closes I got to success was using waitForNewConnection() which would actually return me a socket, but when I connected to the readReady() emitter, that was never fired either. So what would prevent these signals never getting called?

Please spare my sanity and help me as much as you can.


Here is a complete working example, tested using MSVC++ 2010.

This listens for a connection on port 12346, replies with "HELLO WORLD" and logs the connection to a list on the dialog.

main.cpp

#include <QtGui>
#include "console.hpp"

int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  Console con;
  con.show();
  return app.exec();
}

console.hpp

#include <QtCore>
#include <QtGui>
#include <QtNetwork>

class Console : public QDialog
{
  Q_OBJECT
  public:
    Console();

  public slots:
    void connection();

  private:
    QTcpServer mServer;
    QListWidget* mConnList;
};

console.cpp

#include "console.hpp"

Console::Console() :
  QDialog(),
  mServer(),
  mConnList(new QListWidget())
{
  if (!mServer.listen(QHostAddress::Any, 12346))
    qDebug() << "Error during 'listen'" << mServer.errorString();
  connect(&mServer, SIGNAL(newConnection()), this, SLOT(connection()));

  QVBoxLayout* mainLayout = new QVBoxLayout();
  mainLayout->addWidget(mConnList);
  setLayout(mainLayout);
}

void Console::connection()
{
  qDebug() << "CONNECTION";
  QTcpSocket* skt = mServer.nextPendingConnection();
  if (!skt)
    return;

  mConnList->addItem(QString("%1:%2").arg(skt->peerAddress().toString()).arg(skt->peerPort()));

  skt->write("HELLO WORLD!\r\n");
  skt->close();
}

test.pro

TEMPLATE=app
CONFIG+=console debug
QT=core gui network

HEADERS=console.hpp
SOURCES=main.cpp console.cpp


Another working example, again on Linux, although I have coded a program using QTcpServer to run on both Linux and Windows before without a problem. If this doesn't work, surely it must be either a Qt installation or OS configuration problem. Either that or a bug in the Qt version.

~/tcp_test$ qmake --version
QMake version 2.01a
Using Qt version 4.8.6 in /usr/lib/x86_64-linux-gnu

~/tcp_test$ for file in qconsole.{h,cpp} main.cpp tcp_test.pro ; do echo -e "$file:\n"; cat $file; echo; echo; done
qconsole.h:

#include <QDialog>
#include <QTcpServer>

class QConsole : public QDialog
{
    Q_OBJECT
public:
    QConsole();
public slots:
    void connection();
private:
    QTcpServer server;
};


qconsole.cpp:

#include "qconsole.h"

QConsole::QConsole()
{
    server.listen(QHostAddress::Any, 12346);
    QDialog::connect(&server, SIGNAL(newConnection()), this, SLOT(connection()));
}

void QConsole::connection()
{
    qDebug("got connection");
}


main.cpp:

#include <QApplication>
#include "qconsole.h"

int main( int argc, char *argv[] )
{
    QApplication app(argc, argv);
    QConsole * window = new QConsole();
    window->show();

    return app.exec();
}


tcp_test.pro:

QT = core gui network

CONFIG += debug

TARGET = tcp_test

SOURCES = main.cpp  qconsole.cpp

HEADERS = qconsole.h


~/tcp_test$ ./tcp_test &
[3] 9784

~/tcp_test$ nc localhost 12346
got connection
^C
0

精彩评论

暂无评论...
验证码 换一张
取 消