我道歉,我不知道如何为这个问题提供简明的标题。
后台:我正在使用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且连接的当前状态 已断开连接,我可以输入正确端口102并成功连接。
问题:为什么TCP套接字在端口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;
}