同一对象中的 QTcpSocket 到 QTcpSocket

Posted

技术标签:

【中文标题】同一对象中的 QTcpSocket 到 QTcpSocket【英文标题】:QTcpSocket to QTcpSocket in same object 【发布时间】:2018-08-15 14:04:03 【问题描述】:

我试图伪造恰好属于同一类的两个 QTcpSockets 之间的传输(这是一个 googletest 固定装置)。这里的重点是看看我是否可以在两者之间发送多条消息并再次正确提取它们。但是,这两个套接字似乎无法连接。我看到的大多数与此相关的帖子都没有给出有效的答案,而且由于这绝对不是预期的使用方式,我不确定是否有一个简单的方法。

我有什么设置连接:

class TTest : public ::testing::Test, public QObject

    //Q_OBJECT
protected:
    QTcpServer qserv;
    QTcpSocket qtcpsock1; //send
    QTcpSocket *qtcpsock2; //rcv

    TTest() : qserv(this), qtcpsock1(this)
    

        while (!qserv.isListening()) 
        
            qserv.listen();
        
        qtcpsock1.connectToHost(QHostAddress::LocalHost, qserv.serverPort());
        qtcpsock2 = qserv.nextPendingConnection();
        qtcpsock1.waitForConnected();
        if (!qtcpsock2) std::cout << "socket 2 not initialized\n";
        qserv.close();
    

当前未使用的信号/插槽。

【问题讨论】:

【参考方案1】:

这样做的问题是应用程序的事件轮询循环将不会运行,因此不会处理任何事件,并且如果没有它,您的函数调用将根本无法工作。

简而言之,waitForConnected() 调用将等待一个永远不会发生的事件。

使用 Qt 的自然解决方案当然是使用信号和插槽,并让正常的应用程序事件循环运行。


稍微相关的说明:如果您希望在同一进程中进行内部通信,请考虑除(繁重而复杂的)TCP 套接字之外的其他东西。简单的消息队列?匿名管道?纯字符串还是数组?

【讨论】:

我试图模仿测试内部的客户端-服务器,解析数据进出套接字是它的真正意义所在。最终的目的地是两个独立的进程,但我希望我可以测试一个内部的解析。 +1 用于提及信号/插槽,类似于 connect(qserv, SIGNAL(newConnection()), this, SLOT(acceptConnection())); 然后在 acceptConnection() qtcpsocket2 = qserv-&gt;nextPendingConnection() 谢谢你们帮助我增加了我的理解。我最终不得不采取不同的路线并完全移除整个插座。

以上是关于同一对象中的 QTcpSocket 到 QTcpSocket的主要内容,如果未能解决你的问题,请参考以下文章

QTcpSocket真的是全双工的吗?

QTcpSocket 的状态

QTcpSocket类中的ReadyRead()信号没有被触发

Qt QTcpSocket 流式传输

如何使用 QTcpSocket 监听 qt 中的特定端口? [复制]

如何安全地删除 QT::QTcpSocket?