1

抱歉,我不知道如何为这个问题提供一个简洁的标题。

背景:我正在使用 QTcpSocket 连接到 PLC 模拟器应用程序。以前我使用PLCQTLIB连接到模拟器,一切正常。该库没有为我的项目提供足够的功能,因此我创建了自己的库来连接 Qt 和libnodave库。

模拟器在 IP 地址 192.168.32.1 和端口 102 上运行

当前问题:我输入 IP (192.168.32.1) 和端口 (102) 并按连接。我收到:

TCP 错误 = QAbstractSocket::ConnectionRefusedError

TCP 错误 = QAbstractSocket::SocketTimeoutError

如果我将端口更改为 80 并按连接,则连接成功。但是,与 PLC 模拟器的连接将失败,因为它没有在端口 80 上侦听。

现在已经与 192.168.32.1 建立了成功的连接,并且当前的连接状态是disconnected,我可以进入正确的 102 端口,连接成功。

问题:为什么 TCP Socket 直到之前在端口 80 上打开了一个连接之后才建立到端口 102 的连接?不存在防火墙,所有通信都在本地计算机上进行。

在标题中声明:

QTcpSocket *tcp;

源文件:

PLCLibNoDave::PLCLibNoDave()
{
    tcp = new QTcpSocket();

    connect(tcp, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
            this, SLOT(tcpStateChanged(QAbstractSocket::SocketState)));
    connect(tcp, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SLOT(tcpErrorHandler(QAbstractSocket::SocketError)));
    connect(tcp, SIGNAL(hostFound()), this, SLOT(tcpHostFound()));
    connect(tcp, SIGNAL(connected()), this, SLOT(tcpConnected()));
    connect(tcp, SIGNAL(disconnected()), this, SLOT(tcpDisconnected()));
}

void PLCLibNoDave::connectTCP(int port, QString ip)
{
    tcp->connectToHost(ip,port);
    if(!tcp->waitForConnected(3000)){
        tcp->disconnectFromHost();
        return;
    }
    tcpHandle = tcp->socketDescriptor();
    if(tcpHandle == -1){
        tcp->disconnectFromHost();
        qDebug() << "Invalid Socket Descriptor on Connect";
        return;
    }

    return;
}

void PLCLibNoDave::disconnectTCP()
{
    tcp->disconnectFromHost();

    if(tcp->state() == QAbstractSocket::UnconnectedState ||
            tcp->waitForDisconnected(1000)){
        tcpError = tcp->error();
    }
    else{
        tcpError = tcp->error();
        qDebug() << "Disconnect Failed: " << tcp->errorString();
    }
    return;

}
4

0 回答 0