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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Размер отправленных и принятых байт разный  (Прочитано 6664 раз)
CJ1
Гость
« : Июнь 16, 2012, 16:11 »

Люди, из за чего размеры отправленных и принятых байт может быть разный?Непонимающий

Клиент отправляет 9876 , а сервер принимает 8191

Почему так?Непонимающий
Записан
V1KT0P
Гость
« Ответ #1 : Июнь 16, 2012, 16:21 »

Люди, из за чего размеры отправленных и принятых байт может быть разный?Непонимающий

Клиент отправляет 9876 , а сервер принимает 8191

Почему так?Непонимающий
На сколько я знаю телепатов здесь нету. Так что советую хотя бы минимальные куски кода привести.
Записан
CJ1
Гость
« Ответ #2 : Июнь 16, 2012, 16:25 »

Вот код отправки
Цитировать
    QByteArray block;
    QDataStream out(&block,QIODevice::ReadWrite);
    out.setVersion(QDataStream::Qt_4_7);
    out << qint8('Y');
    out <<quint8('A');
    qint32 x,y;
    x =qint32(ui->tableWidget->rowCount()-2);
    y = qint32(ui->tableWidget->columnCount()-1);
    out << x << y;


    for(int row=2; row< ui->tableWidget->rowCount(); row++){
        for(int column = 1; column<ui->tableWidget->columnCount(); column++){
            out << ui->tableWidget->item(row,0)->text();
            out << ui->tableWidget->item(0,column)->text();
            out << ui->tableWidget->item(row,column)->text();
            if (column < 5){
               out << qint8('1');
             } else{
               out << qint8('2');
            }
        }
    }


    int w = _sock->write(block);
//   QMessageBox::information(0,"",QString::number(w));


Вот код приема
   
Цитировать
     QDataStream in(clientSocket);
        in.setVersion(QDataStream::Qt_4_7);
        QMessageBox::information(0,"",QString::number(clientSocket->size()));

Если я отправляю байты, до 8191, то все ок если выше, он тупо принимает 8191
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июнь 16, 2012, 16:35 »

наверное 8 кб – это лимит для одного куска данных
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
CJ1
Гость
« Ответ #4 : Июнь 16, 2012, 16:40 »

Ха, а если я Ставлю еще оди месагбок то все работает!
Код:
     QDataStream in(clientSocket);
        in.setVersion(QDataStream::Qt_4_7);
        QMessageBox::information(0,"",QString::number(clientSocket->size()));
 QMessageBox::information(0,"",QString::number(clientSocket->size()));
Записан
CJ1
Гость
« Ответ #5 : Июнь 16, 2012, 16:42 »

И показывает, ровно то количество которое и надо!
Записан
V1KT0P
Гость
« Ответ #6 : Июнь 16, 2012, 16:46 »

Ха, а если я Ставлю еще оди месагбок то все работает!
Код:
     QDataStream in(clientSocket);
        in.setVersion(QDataStream::Qt_4_7);
        QMessageBox::information(0,"",QString::number(clientSocket->size()));
 QMessageBox::information(0,"",QString::number(clientSocket->size()));
Давай уточним: ты ведь понимаешь что данные приходят не все сразу а по кускам?
Записан
CJ1
Гость
« Ответ #7 : Июнь 16, 2012, 16:54 »

Понимаю! И он сам должен стоять и ждать пока данные придет все!
Еще помогает это
Код:
QApplication::processEvents(QEventLoop::AllEvents, 30000);
QDataStream in(clientSocket);
        in.setVersion(QDataStream::Qt_4_7);
        QMessageBox::information(0,"",QString::number(clientSocket->size()));
 QMessageBox::information(0,"",QString::number(clientSocket->size()));
Записан
V1KT0P
Гость
« Ответ #8 : Июнь 16, 2012, 17:03 »

Понимаю! И он сам должен стоять и ждать пока данные придет все!
Еще помогает это
Код:
QApplication::processEvents(QEventLoop::AllEvents, 30000);
QDataStream in(clientSocket);
        in.setVersion(QDataStream::Qt_4_7);
        QMessageBox::information(0,"",QString::number(clientSocket->size()));
 QMessageBox::information(0,"",QString::number(clientSocket->size()));
Госпади... Есть два варианта получения данных:
1) Если размер пакета фиксированный, то ждешь(или кладешь в буфер) пока размер не станет равен или больше нужного. Тогда берешь первый кусок и обрабатываешь его.
2) Если размер пакета не фиксированный, то ждешь пока не прийдет заголовок, из заголовка читаешь размер. И ждешь(или кладешь в буфер) пока размер не станет равен или больше нужного. Тогда берешь нужный кусок и обрабатываешь его.
Все банально. На сколько я понимаю ты даже не ждешь пока придут все данные, а сразу по первому куску пытаешь обработать.
Записан
CJ1
Гость
« Ответ #9 : Июнь 16, 2012, 17:08 »

Этот вариант я делал, с самого начало, там какието косяки были, но щас попробую снова, но не факт что проканает.

Этот вариант, конечно везде описан...
Записан
CJ1
Гость
« Ответ #10 : Июнь 17, 2012, 11:34 »

Спасибо V1KT0P, так и сделал, ты правильно сказал.....
Да, я брал первый же кусок, и работал с ним.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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