【问题标题】:QTcpClient successfully connects, but not to my server. Where is it connecting?QTcpClient 成功连接,但没有连接到我的服务器。它在哪里连接?
【发布时间】:2011-09-20 00:11:06
【问题描述】:

我已经使用 Qt 的 Tcp Sockets API 成功构建了一个瘦客户端/服务器。我知道它工作得很好,因为我已经通过网络发送了大量数据并进行了验证。但是,我的项目经理想要一套单元测试,我正在使用 Qt 的测试库来实现它们。

无论如何,我正在尝试设置一些虚拟服务器来简单地从 QTcpSocket 接收数据,以验证单元测试中的 sendData() 方法。当我连接测试套接字时,显示它已连接,但连接虚拟服务器及其虚拟套接字的插槽从未被调用!

谁能看到我在这里做错了什么? (我已将代码精简到测试类中似乎损坏的部分)

来自 tst_tcpcommsocket.h

#ifndef TST_TCPCOMMSOCKET_H
#define TST_TCPCOMMSOCKET_H

#include <QtCore/QString>
#include <QtTest/QtTest>

#include <iostream>

#include <QTcpSocket>
#include <QTcpServer>

class TcpCommSocketTest : public QObject
{
    Q_OBJECT

private:
    QTcpSocket* qTestSocket;
    QTcpSocket* qDummySocket;
    QTcpServer* qDummyServer;

public:
        TcpCommSocketTest();

public slots:
    void connectDummyServer();

private Q_SLOTS:
    void initTestCase();    
    void sendDataTest();    
    void cleanupTestCase();
};

#endif // TST_TCPCOMMSOCKET_H

来自 tst_tcpcommsocket.cpp

#include "tst_tcpcommsocket.h"

void TcpCommSocketTest::connectDummyServer()
{
    cout << "connection attempt" << endl;
    qDummySocket = qDummyServer->nextPendingConnection();
}

void TcpCommSocketTest::initTestCase()
{
    qDummySocket = NULL;
    qDummyServer = new QTcpServer();
    qDummyServer->listen( QHostAddress("127.0.0.1"), 9000 );
    connect( qDummyServer, SIGNAL(newConnection()), SLOT(connectDummyServer()) );

    qTestSocket = new QTcpSocket();
    qTestSocket->connectToHost( QHostAddress("127.0.0.1"), 9000 );

    QVERIFY( qTestSocket->waitForConnected( 5000 ) );
    QVERIFY( qTestSocket->state() == QTcpSocket::ConnectedState );
}

void TcpCommSocketTest::sendDataTest()
{
    int i=0;
    QVERIFY( qDummySocket != NULL );
}

QTEST_MAIN(TcpCommSocketTest);

测试运行的输出:

********* Start testing of TcpCommSocketTest *********
Config: Using QTest library 4.7.3, Qt 4.7.3
PASS   : TcpCommSocketTest::initTestCase()
FAIL!  : TcpCommSocketTest::sendDataTest() 'qDummySocket != NULL' returned FALSE. ()
   Loc: [-]
cleanup
PASS   : TcpCommSocketTest::cleanupTestCase()
Totals: 2 passed, 1 failed, 0 skipped

【问题讨论】:

    标签: c++ qt qtestlib


    【解决方案1】:

    QTEST_MAIN 创建一个 QApplication 并运行所有测试,它是按顺序执行的,而不是事件循环。因此,虽然您的套接字确实可以连接到服务器(意思是 qTestSocket-&gt;waitForConnected() 返回 true),但由于应用程序不会返回事件循环,QTcpServer 的信号将不会被发出,并且 TcpCommSocketTest::connectDummyServer()永远不会被调用。

    尝试在initTestCase() 末尾添加对qApp-&gt;processEvents() 的调用。它应该让connectDummyServer() 被调用。

    【讨论】:

    • 非常感谢。那是正确的解决方案。我的单元测试现在可以正常运行了。
    【解决方案2】:

    您可能正在连接到之前启动的服务器实例。使用进程监视器四处查看以确保您没有任何杂散实例。您的测试设置是否会自动启动和关闭虚拟服务器?可能是测试成功启动了服务器,但没有杀死它。

    另外,从 127.0.0.1 开始,虚拟服务器与测试代码在同一台机器上运行,对吧?

    【讨论】:

    • 我在 listen() 调用周围添加了一个 QVERIFY(),它通过了。我还尝试了 QVERIFY( qDummyServer->isListening() ),结果很好。我检查了一下,没有运行杂散进程(ps -e),netstat 没有显示任何监听端口 9000 的内容。虚拟服务器在同一台机器上运行。
    【解决方案3】:

    验证qDummyServer-&gt;listen()的返回值。如果服务器确实在端口 9000 上侦听,它应该返回 true。如果它返回 false,则可能是端口 9000 被另一个进程阻塞,它无法侦听。在这种情况下,您的 qTestSocket 连接到该其他进程而不是您自己的服务器。

    【讨论】:

      猜你喜欢
      • 2021-05-09
      • 2011-04-03
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 2018-04-13
      • 2018-05-10
      相关资源
      最近更新 更多