• 10578阅读
  • 3回复

TCP的连接状态老是state()==UnconnectedState [复制链接]

上一主题 下一主题
离线newedition
 
只看楼主 倒序阅读 楼主  发表于: 2012-09-11
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2012-09-14) —
我的项目跟网游的更新差不多,服务器端监听端口,有连接就给对方传文件
在网上找了一段代码,改了下,有错误

void Server::incomingConnection(int sockedId)
{
    qDebug()<<"连接成功";
     //tcpSocket->setSocketDescriptor(sockedId);

    filePath = QFileDialog::getOpenFileName(this);

    QFile file(filePath);
    if(!file.open(QIODevice::ReadOnly))
    {
        QMessageBox::warning(this, tr("Error"),tr("文件名错误!请输入有效的文件名及路径。"),QMessageBox::Close);
        disconnectFromHost();
        return;
    }

    ui->stateLbl->setText("开始发送!!!");
    QString fileName = file.fileName();
    fileName = fileName.remove(0, fileName.lastIndexOf('/')+1);

    qint64 size;
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_7);

    out << qint16(0x0001) << fileName.toUtf8();
    size = block.size();

    write((char*)&size, sizeof(qint64));
    write(block.data(), size);
    //flush();  

    if(!waitForBytesWritten(-1))    {
        qDebug() << "writen Bytes error " << QIODevice::errorString();
        //throw 2;
    }
    do
    {
        block.clear();
        out.device()->seek(0);
        out << qint16(0x0002) << file.read(0xFFF0);
        size = block.size();
        qDebug() << "Send Data " << size << " byte.";

        write((char*)&size, sizeof(qint64));
        write(block.data(), size);
        if(!waitForBytesWritten(-1))
        {
            qDebug() << "writen Bytes error " << QIODevice::errorString();
            //throw 2;
        }
    }while(!file.atEnd());

    sendEOF();


    qDebug() << "发送完成!!!";
    ui->stateLbl->setText("发送完成!!!");
    forever/*(int i=0; i < 10; i++)*/
    {
        if(!waitForDisconnected())
        {
            //sendEOF();
        }
        else
        {
            //qDebug() << "Number is " << i << ".";
            qDebug() << "GoTo return.";
            return;
        }
    }
       disconnectFromHost();        // have Error.
}

执行if(!waitForBytesWritten(-1)) 这句,就会中断,报的错误是:
QAbstractSocket::waitForDisconnected() is not allowed in UnconnectedState

求高手解答下  谢谢
离线newedition
只看该作者 1楼 发表于: 2012-09-12
难道是问题太简单了  高手都懒得回答?
离线XChinux

只看该作者 2楼 发表于: 2012-09-14
你调用的write()方法,本意时想给客户端写东西吧?就是那个tcpSocket,可实际上write()是this的,就是说是QTcpServer的,这就不对了。应该是tcpSocket->write(xxxx).

QTcpServer管理若干QTcpSocket,只要有一个连接进来,就生成一个QTcpSocket与其对应,向这个QTcpSocket里写东西,就会发送到客户端,而不是直接给QTcpServer写东西。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线newedition
只看该作者 3楼 发表于: 2012-09-17
嗯嗯   可能是我先前的代码是这样写的:

class widget : public QDialog,public QTcpSocket,public QTcpServer
{
    Q_OBJECT .............

现在改成下面这样就好了  
tcpSocket=tcpServer->nextPendingConnection();
tcpSocket->write(block);
快速回复
限100 字节
 
上一个 下一个