Russian Qt Forum
Март 29, 2024, 02:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача файлов через tcp socket  (Прочитано 11721 раз)
skibon02
Гость
« : Март 31, 2018, 21:18 »

Пытаюсь реализовать в моей программе передачу данных. Уже 3 дня сижу не пойму в чем проблема. На одном компьютере запущен tcp server, на другом tcp socket который подключается к серверу и отправляет информацию: длину названия директории, название директории, длину файла, сам файл. Какое-то время работала передача мелкий файлов, теперь отправляет только 1 байт.

это клиент который отправляет файл
Код:
   QString fname = QFileDialog::getOpenFileName(this, tr("Выберите файл"));
    QString destfname = QInputDialog::getText(this, "Выбор удалённой директории","Введите путь:");
    QFile file(fname);
    file.open(QIODevice::ReadOnly);
    qDebug() << "start reading file";
    QByteArray dataarr = file.readAll();
    qDebug() << "file read end. read bytes:" << dataarr.size();
            QTcpSocket *tsoc = new QTcpSocket(this);
            QByteArray sendarr;
            connect(tsoc, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(haner(QAbstractSocket::SocketError)));
            qDebug() << "connecting to host...";
            tsoc->connectToHost((QHostAddress)ui->listWidget->item(i)->text(), 16666);
            if(tsoc->waitForConnected(3000))
                qDebug() << "connected to host!";
            else
            {
                qDebug() <<"can't connect to host!";
                continue;
            }
            sendarr.clear();
            sendarr.push_back(destfname.size());
            qDebug() << "sending fname size...";
            tsoc->write(sendarr);
            tsoc->waitForBytesWritten();
            sendarr.clear();
            sendarr = destfname.toUtf8();
            qDebug() << "sending fname...";
            tsoc->write(sendarr);
            tsoc->waitForBytesWritten();
            sendarr.clear();
            sendarr.push_back(dataarr.size()/256/256/256);
            sendarr.push_back(dataarr.size()/256/256%256);
            sendarr.push_back(dataarr.size()/256%256);
            sendarr.push_back(dataarr.size()%256);
            qDebug() << "sending data size...";
            tsoc->write(sendarr);
            tsoc->waitForBytesWritten();
            qDebug() << "writing file: " << tsoc->write(dataarr) << "bytes";
            tsoc->waitForBytesWritten();
            if(tsoc->waitForDisconnected(-1))
                qDebug() << "disconnected!";
            tsoc->close();

это сервер, принимает файл
Код:

        QTcpServer *listener = new QTcpServer(this);
        connect(listener, SIGNAL(acceptError(QAbstractSocket::SocketError)), this, SLOT(erhandle(QAbstractSocket::SocketError)));
        listener->listen(QHostAddress::AnyIPv4, 16666);
        listener->waitForNewConnection(5000);
        QTcpSocket* tsoc;
        if(listener->hasPendingConnections())
        {
            tsoc = listener->nextPendingConnection();
            connect(tsoc, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(erhandle(QAbstractSocket::SocketError)));
        }
        else
        {
            qDebug() << "no connections!";
            break;
        }
        tsoc->waitForReadyRead(-1);
        QByteArray inarr;
        qint8 fnamesize;
        qDebug() << "reading filename length";
        while(1)
            if(tsoc->bytesAvailable() >= 1)
            {
                qDebug() << tsoc->bytesAvailable();
                inarr = tsoc->read(1);
                break;
            }
            else
                qDebug() << tsoc->bytesAvailable();
        fnamesize = (qint8)inarr[0];
        inarr.clear();
        QByteArray fname;
        fname.resize(fnamesize);
        qDebug() << "filename size" << fnamesize;
        if(tsoc->bytesAvailable() == 0)
        {
            qDebug() << "only 1 byte recieved";
            tsoc->close();
            break;
        }
        qDebug() << "reading filename";
        while(1)
            if(tsoc->bytesAvailable() >= fnamesize)
            {
                qDebug() << tsoc->bytesAvailable();
                fname = tsoc->read(fnamesize);
                break;
            }
            else
                qDebug() << tsoc->bytesAvailable();
        inarr.clear();
        qDebug() << "filename" << fname;
        qDebug() << "reading data length";
        while(1)
            if(tsoc->bytesAvailable() >= 4)
            {
                qDebug() << tsoc->bytesAvailable();
                inarr = tsoc->read(4);
                break;
            }
            else
                qDebug() << tsoc->bytesAvailable();
        qint32 datasize =  (quint8)inarr[0]*256*256*256 + (quint8)inarr[1]*256*256 + (quint8)inarr[2]*256 + (quint8)inarr[3];
        qDebug() << "data size" << datasize;
        qDebug() << "reading data";
        int tempsize = datasize;
        QByteArray data;
        qDebug() << "wiiting for data";
        while(1)
        {
            if(tempsize <= 0)
                break;
            qDebug() << tsoc->bytesAvailable();
            QByteArray tempdata = tsoc->readAll();
            data.append(tempdata);
            tempsize -= tempdata.size();
        }
        QFile file(fname);
        file.open(QIODevice::WriteOnly);
        file.write(data);
        file.close();
        tsoc->close();
        listener->close();


« Последнее редактирование: Март 31, 2018, 21:26 от skibon02 » Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #1 : Апрель 01, 2018, 10:32 »

что будет делать код "sendarr.push_back(destfname.size());" если размер фала больше 255 байт ?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 22.