• 5547阅读
  • 0回复

[提问]QT4.7里tcpSocket->connectToHost运行时报“Segmentation fault”错误 [复制链接]

上一主题 下一主题
离线minrenkon
 

只看楼主 倒序阅读 楼主  发表于: 2011-08-24
我在学习QT正好在学TCP时找到的例子里用QWidget建的项目是能正常运行,但是我改用QMainWindow建项目运行时调试运行时报“Segmentation fault”错误编译都是正常的,只有在发送时报这个错。


我的开发环境是XP,QT装的是4.7.4,用的是Qt Creator开发环境。


报错的地方是这里(tcpSocket->connectToHost(address, pord);),最不明白的就是运行时是从操作系统里报出来,我是通过调试里才找到这个错误。


下面是代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::seedMSG()
{
    if (!ui->seedLineEdit->text().isNull() && ui->seedLineEdit->text().length() > 0) {
        sendCount++;
        blockSize = 0; //初始化其为0
        QString address;
        quint16 pord;
        address = ui->hostLineEdit->text();
        pord = ui->portLineEdit->text().toInt();
        tcpSocket->abort(); //取消已有的连接
        try
        {
        tcpSocket->connectToHost(address, pord);//连接到主机,这里从界面获取主机地址和端口号
        }
        catch (QString exception)
        {
            QString s = exception;
            QMessageBox::about(0,"error",s);
        }

        tcpSocket->write(ui->seedLineEdit->text().toAscii().data()); //发送seedLindeEdit的内容
        ui->seedLineEdit->clear();
        tcpSocket->close();
        ui->seedLineEdit->setFocus(); //让seedLineEdit获取焦点
    } else {
        qDebug() << "error else";
    }
}

void MainWindow::readMSG()
{
    QDataStream in(tcpSocket);
//    in.setVersion(QDataStream::Qt_4_7);
    //设置数据流版本,这里要和服务器端相同
    if(blockSize==0) //如果是刚开始接收数据
    {
        //判断接收的数据是否有两字节,也就是文件的大小信息
        //如果有则保存到blockSize变量中,没有则返回,继续接收数据
        if(tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return;
        in >> blockSize;
    }
    if(tcpSocket->bytesAvailable() < blockSize) return;
    //如果没有得到全部的数据,则返回,继续接收数据
    in >> serverMSG;
    //将接收到的数据存放到变量中
    ui->messageLabel->setText(serverMSG);
    //显示接收到的数据
}

void MainWindow::displayError(QAbstractSocket::SocketError)
{
    qDebug() << tcpSocket->errorString(); //输出错误信息
}

void MainWindow::on_pushButton_clicked()
{
    this->seedMSG();
}

快速回复
限100 字节
 
上一个 下一个