您的位置:首页 > 理论基础 > 计算机网络

(Qtcpsocket)退出程序时提示段错误的解决

2010-11-01 17:49 337 查看
这几天使用QT附带的一个example程序fortuneclient,开发了一个tcp通信的小程序,偶然间发现原来的程序存在一个小bug,当填入的ip地址或者端口号错误,关闭程序时,会报段错误,并弹出runtime error出错框。

仔细观察了一下,程序出错时,在QT Creator的application output框里不断的提示
QNativeSocketEngine::write() was not called in QAbstractSocket::ConnectedState

并且错误处理函数displayError,会报两次error,弹出两次出错提示的窗口

然后上网搜了一下,也没有发现明确的解决方法。

再仔细单步跟了一下代码,发现代码中存在这样一个问题:

tcpSocket->connectToHost(hostLineEdit->text(),
portLineEdit->text().toInt());                            //连接到服务端

.....

if ( (iRet=tcpSocket->write(send_buf))==-1)
return false;
else
return true;


由于connectToHost函数是一个void型,所以执行完这一步,并不能判断是否真的连到了服务器。我单步执行了一下,发现ip和port填错,程序也会执行到下面的write。没有建好连接,就向socket中写入信息,大概问题就出在这里了。

解决的方法是,将write部分单独做成一个SLOT函数,命名为Login(),然后建立一个信号槽,如下:

connect(tcpSocket, SIGNAL(connected()), this, SLOT(Login()));

......

void Login()
{
if ( (iRet=tcpSocket->write(send_buf))==-1)
return false;
else
return true;
}


当connecttoHost执行成功时,会触发connected信号,然后就会调用Login()函数。这次再试了一下啊,当输入错误ip和port时,程序只会进入displayError一次,并给出相应的提示,也不会执行Login()里的write,再关闭该程序,没有再发生段错误或者runtime error窗口。输入正确的ip和端口号,则能够正确的连接到服务端,并且触发Login()函数

参考:http://www.qtcn.org/bbs/read.php?tid=25464
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐