Доброго времени суток. У меня вопрос до боли заезженный на этом форуме, собственно, отсюда и брал код реализации.
Проблема вот в чем. Есть клиент. Он может передавать файл ( > 100 Мб) другому клиенту. Передача происходит в отдельном потоке. Передается файл нормально, а вот собрать его не получается. Программа зависает на 99% приема.
Код обработчика на отправку файла:
void MainWindow::slot_send_file_menu_handler()
{
QTcpServer* server_to_send = new QTcpServer(this);
if(!server_to_send->listen(QHostAddress::Any, 1234))
return;
QObject::connect(server_to_send, SIGNAL(newConnection()), this, SLOT(slot_new_connection()));
}
void MainWindow::slot_new_connection()
{
QTcpSocket* socket_to_send = ((QTcpServer*)(sender()))->nextPendingConnection();
SendFileThread* thread = new SendFileThread();
thread->set_params(socket_to_send, QString("d:\\work\\nets.zip"));
}
В потоке, при установке параметров поток запускается. Собственно в нем и происходит передача файла.
void SendFileThread::set_params(QTcpSocket *socket, QString path)
{
_socket = socket;
_path = path;
start();
}
void SendFileThread::run()
{
QFile file_to_send(_path);
QDataStream read(&file_to_send);
file_to_send.open(QFile::ReadOnly);
QByteArray bArray;
QDataStream dStream(&bArray, QIODevice::WriteOnly);
dStream.setVersion(QDataStream::Qt_4_5);
dStream << quint64(file_to_send.size());
dStream << _path;
_socket->write(bArray);
_socket->waitForBytesWritten();
long lBytes = 0;
char ch[1024];
ch[1023] = '\0';
while(!read.atEnd())
{
int l = read.readRawData(ch, sizeof(char)*1023);
QByteArray ba(ch, sizeof(char)*l);
lBytes += _socket->write(ba, sizeof(char)*l);
_socket->waitForBytesWritten();
_socket->flush();
if (-1 == lBytes){
qWarning() << "Error";
_socket->close();
return;
}
}
}
Когда клиент соглашается принять файл:
void MainWindow::slot_info_menu_handler()
{
QTcpSocket* socket = new QTcpSocket(this);
socket->connectToHost("172.16.252.174", 1234);
QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(slot_read_client()));
}
Ну и функция приема:
QTcpSocket* _socket = ((QTcpSocket*)sender());
quint64 fileSize;
QString getedFilePath;
QString usedFilePath;
_socket->waitForReadyRead(-1);
QByteArray bArray;
QDataStream dStream(&bArray, QIODevice::ReadWrite);
dStream.setVersion(QDataStream::Qt_4_5);
bArray = _socket->readAll();
dStream >> fileSize;
qDebug () << "fileSize" << fileSize;
dStream >> getedFilePath;
qDebug () << "getedFilePath" << getedFilePath;
usedFilePath = getedFilePath;
QFile save(usedFilePath);
save.open(QFile::WriteOnly);
QDataStream write(&save);
write.setVersion(QDataStream::Qt_4_5);
long int lBytesDone = 0;
long int lSize = fileSize;
qDebug () << "lSize" << lSize;
long int lBytes;
while (lBytesDone < lSize){
lBytes = 0;
while (lBytes == 0)
lBytes = _socket->waitForReadyRead(-1);
if (!lBytes){
qWarning("-----TFileServer: Aborting download.");
_socket->close();
return;
}
QByteArray tmp = _socket->readAll();
lBytes += write.writeRawData(tmp.data(), tmp.size());
lBytesDone += tmp.size();
float procentage = ((float)lBytesDone / fileSize) * 100;
qDebug () << procentage;
}
save.close();
qDebug () << "File saved";
Но файл передается не полностью, программа зависает на 99%.
Подскажите, пожалуйста, в чем может быть проблема и как ее решить?
Спасибо.