双向QTcpSocket文件传输问题

时间:2013-05-07 11:24:22

标签: c++ multithreading qt qtcpsocket qtnetwork

我对此感到有点难过,并且对文件传输没有太多经验,所以希望我只是做些蠢事。

反正。问题。我正在从客户端向我的服务器发送一个文件块。这很好用。在发送过程中,我的客户端定期等待进度消息,因此我知道已发送了多少数据。但是,当我发送任何进度消息时,文件传输在服务器端超时。

我很确定这不是客户端代码的问题所以我会把它留下来。我已经评论了两条似乎在sendFeedback()方法中杀死东西的行。使用两个注释掉的行,waitforReadyRead()几乎会立即在主循环中超时。这几乎就像写出套接字阻止读取套接字上的任何信息一样,并阻止任何进一步的数据被读取。

感觉就像我在“同时”发送和接收时错过了带套接字的东西,但我在文档中找不到任何内容。

非常感谢任何想法。

文件接收代码:

const int Timeout = 30 * 1000;
QTcpSocket tcpSocket;

if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
    emit error(tcpSocket.error());
    return;
}

while(totalBytesRead<blockSize && !error && !success)
{       

    int toRead = blah blah blah
    //loop until chosen chunk amount is available on socket
    while (tcpSocket.bytesAvailable() < toRead) 
    {
        //if no reply from socket, exit
        if (!tcpSocket.waitForReadyRead(Timeout))
        {
            error=true;
            break;
        }
    }
        //read data
    int actuallyRead = in.readRawData(datas, toRead);
    //if data read
    if(actuallyRead)
    {                   
        sendFeedback(&tcpSocket, actuallyRead);
        //write the chunk to disk
        out.writeRawData(datas,actuallyRead);
        if(totalBytesRead == blockSize)
        {
                success = true;
            break;
        }
    }
}   

这是我的反馈功能:

void FileServerThread::sendFeedback(QTcpSocket* tcpSocket, int bytesActuallyRead)
{
    //send some progress back to the client
    QByteArray bytesReadArray;
    QDataStream out(&bytesReadArray, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);                    
    out << bytesActuallyRead;

    //feedback requires this but fails with these 2 lines
    //tcpSocket->write(bytesReadArray);
    //tcpSocket->waitForBytesWritten();
}

0 个答案:

没有答案