Поиск:

Ответ в темуСоздание новой темы Создание опроса
> qtcpsocket не удается записать данные, Сокет закрыт для записи 
:(
    Опции темы
rudolfninja
Дата 14.12.2013, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: нет
Всего: 6



Добрый вечер. Проблема описана в названии темы: не получается записать данные в сокет, если вызвать у него isWritable(), то всегда возвращается false.
В разделе закрытых переменных класса объявлен указатель на QTcpSocket
Код

QTcpSocket* _client_socket;

При подключении к серверу в по этому адресу записывается сокет клиента. Клиент только один, поэтому достаточно только одного указателя.
Код

_client_socket = _socket->nextPendingConnection();
 QObject::connect(_client_socket, SIGNAL(readyRead()), this, SLOT(slot_read_client()));

Функция отправки:
Код

void server::send_file_to_client(QString &file_path)
{
    QFile file_to_send(file_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());
    qDebug() << quint64(file_to_send.size());
    dStream << file_path;
     _client_socket->write(bArray);
    _client_socket->flush();

    long lBytes = 0;
    char ch[1024];
    ch[1023] = '\0';
    qDebug() << file_path;
    while(!read.atEnd())
    {
        int l = read.readRawData(ch, sizeof(char)*1023);
         QByteArray ba(ch, sizeof(char)*l);
         lBytes += _client_socket->write(ba, sizeof(char)*l);
         _client_socket->waitForBytesWritten();
         _client_socket->flush();
         if (-1 == lBytes){
           qWarning() << "Error";
           _client_socket->close(); //Закрываем устройство сокета
           return;
         }

         float procentage = ((float)lBytes / file_to_send.size()) * 100;
    }//while(!readEnd())
}

В итоге получаю ошибку на строке " _client_socket->write(bArray);":
Код

QIODevice::write: ReadOnly device

В функции main происходит все вот так:
Код

server host;
    if(host.start(1111))
        QTextStream(stdout) << "success" << endl;
    else
        QTextStream(stdout) << "failed" << endl;
    /*int ch = 0;
    QTextStream(stdin) >> ch;
    if(ch)*/
    Sleep(10000);
    qDebug() << "start";
        host.send_file_to_client(QString("D:\\Downloads\\PROGNOZDev8.rar"));

Пробовал делать отправку и при нажатии на клавишу и через какое то время. Все равно ничего не выходит.
Я полагаю, что проблема в синхронизации. Хотя клиентский сокет просто ждет и все. Ему ничего не передается. 

Подскажите, в чем может быть дело и как проверить мою версию (про синхронизацию), не вынося пересылку в отдельный поток?
PM MAIL Skype   Вверх
rudolfninja
Дата 16.12.2013, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: нет
Всего: 6



Ребят, с этим разобрался (вынес передачу файла в отдельный поток). Файл передается, но не до конца. Передается только 99%
Вот кода передачи файла:
Код

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;
        }
    }
}

Когда я начинаю собирать файл, то он собирается только на 99.9 процентов и все. Программа повисает. 
Код сборки файла:
Код

    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";

В итоге программа циклится на 
Код

 while (lBytes == 0)
            lBytes = _socket->waitForReadyRead(-1);

Когда в procentage 99.9 процентов.
Если кто-нибудь знает в чем проблема, подскажите пожалуйста.
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.