我只是无法让QTcpServer正常工作(从未调用过newConnection)



我知道有人问过类似的问题,但我还没有找到解决问题的答案。

我正在调整一些现有的Qt代码,为我公司使用的程序添加服务器功能。为此,我在现有对话框中添加了一个QTcpServer对象,调用listen()并将一个插槽连接到newConnection发射器,如:

    .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()));
    }

主要是:

    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()从未被调用,所以我看不到相关性,但它在这里:

   void QConsole::new_Connection()
   {
   }

这很好,因为我的程序开始侦听指定的端口,如果我远程登录到它,它会建立某种连接,但永远不会调用new_connection()!

我早在2005年就看到过关于这个问题的帖子,所以这显然不是什么新鲜事,但我还没有找到一个令人满意的问题答案(或者任何答案)。这让工作中的每个人都感到困惑,甚至是编写了Qt服务器程序的人。我猜测现有框架存在根本性的问题,但我不知道它可能是什么

我已经为此苦恼了一天半,我成功的方法是使用waitForNewConnection(),它实际上会给我返回一个套接字,但当我连接到readReady()发射器时,它也从未启动。那么,是什么能阻止这些信号永远不会被调用呢?

请让我保持理智,尽你所能帮助我。

这是一个完整的工作示例,使用MSVC++2010进行了测试。

这会侦听端口12346上的连接,回复"HELLO WORLD"并将连接记录到对话框上的列表中。

main.cpp

#include <QtGui>
#include "console.hpp"
int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  Console con;
  con.show();
  return app.exec();
}

控制台.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!rn");
  skt->close();
}

test.pro

TEMPLATE=app
CONFIG+=console debug
QT=core gui network
HEADERS=console.hpp
SOURCES=main.cpp console.cpp

另一个工作示例,同样是在Linux上,尽管我以前使用QTcpServer编写了一个程序,可以在Linux和Windows上运行,但没有问题。如果这不起作用,肯定是Qt安装或操作系统配置问题。要么就是Qt版本中的一个错误。

~/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

相关内容

  • 没有找到相关文章

最新更新