【程序结构】
ui->lineEdit->text() 中输入服务端ip地址 ,端口
connect按钮点击,链接服务器,槽: on_connectButton_clicked
槽程序:
1 void Dialog::on_connectButton_clicked() 2 { 3 tcpSocket.connectToHost(ui->ipLineEdit->text(),ui->portLineEdit->text().toInt());4 }
【问题】
直接在lineEdit中输入正确ip和端口,链接没有问题。如果修改成错误的ip或者端口,再点击链接,会失败;然后再改成正确的,依然会失败。
【原因】
正常的流程是:
1、connectToHost之后,tcpSocket的状态变为2( socket开始建立连接.)
2、在tcpSocket发送readyRead信号之后, tcpSocket的状态才变为3( 连接建立成功 )
3、然后开始处理数据,
4、处理完后数据后tcpSocket->disconnectFromHost();
5、至此tcpSocket的状态又恢复为0 ( 未连接 )
------------------------------------------------------------------------------------------------------------------------
错误流程是:
1、当我将IP改为一个不存在的IP后, connectToHost之后,tcpSocket的状态变为2( socket开始建立连接.)
2、而此时因ip是错误的,没有数据可操作,因此不会发送readyRead信号,tcpSocket的状态也就一直保持为2,
3、当下次再改为正确的IP后,connnectToHost时一看tcpSocket状态是2,结果就报错了。
【解决】
增加 waitForConnected,该接口判断主机是否链接上,如果没有链接上回返回false,并且把state重置。
这里做了个小实验:
1 void Dialog::on_connectButton_clicked() 2 { 3 QString s1; 4 QString s2; 5 tcpSocket.connectToHost(ui->ipLineEdit->text(),ui->portLineEdit->text().toInt()); 6 s1 = QString::number(tcpSocket.state(),10); 7 if(!tcpSocket.waitForConnected(2)) 8 { 9 s2 = QString::number(tcpSocket.state(),10); 10 QString s3 = "not connected "; 11 s3+="state0:"+s1+" state1:"+s2; 12 ui->label->setText(s3); 13 } 14 }
最终效果如下,可以看到state状态发生改变:

槽函数最终修改:
1 void Dialog::on_connectButton_clicked() 2 { 3 tcpSocket.connectToHost(ui->ipLineEdit->text(),ui->portLineEdit->text().toInt()); 4 //必须要加这一步,否则一开始输出错误的ip或者端口,state会由0变成2,下次再调用connectToHost,无效。connectToHost必须在state为0才能往下执行。 5 if(!tcpSocket.waitForConnected(1)) 6 { 7 ui->label->setText("not connected"); 8 } 9 }
posted on
浙公网安备 33010602011771号