QTcpClient成功连接,但不能连接到我的服务器。它在哪里连接?

时间:2011-06-22 01:31:53

标签: c++ qt qtestlib

我已经使用Qt的Tcp套接字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);

Test Run的输出:

********* 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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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