【程序结构】

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 2017-03-01 11:04  aquafly  阅读(2652)  评论(0)    收藏  举报