crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Теряются данные в сокете
iCast
  опции профиля:
сообщение 24.12.2012, 21:12
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 22
Регистрация: 22.9.2012
Пользователь №: 3527

Спасибо сказали: 0 раз(а)




Репутация:   0  


Привет, сервер отправляет строку клиенту,но до клиента строка не доходит. Передаю строку: "==="
void MainWindow::slotReadyRead()
{
    QDataStream in(pSocket);
    in.setVersion(QDataStream::Qt_4_8);
    forever  
    {
        if ( ! nextBlockSize)
        {
            if (pSocket->bytesAvailable() < sizeof(quint16))

                break;
            in >> nextBlockSize;  
        }
        if (pSocket->bytesAvailable() < nextBlockSize)
            qDebug()<<"fail";
        qDebug()<<"bytesAvailable()"<<pSocket->bytesAvailable(); //bytesAvailable() 38
        qDebug()<<"nextBlockSize"<<nextBlockSize; //nextBlockSize 51413

             break;  
       QString str;
       in >> str;
       qDebug()<<"Str";
       qDebug()<<str;
       nextBlockSize = 0;
    }
}


Почему теряются данные?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 24.12.2012, 21:34
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Последний break должен быть внутри последнего if'a.
Как-то так:
if (pSocket->bytesAvailable() < nextBlockSize)
{
    qDebug()<<"fail";
    qDebug()<<"bytesAvailable()"<<pSocket->bytesAvailable(); //bytesAvailable() 38
    qDebug()<<"nextBlockSize"<<nextBlockSize; //nextBlockSize 51413
    break;
}

А в твоем варианте до считывания строки просто никогда не дойдет, всегда будет срабатывать break

Сообщение отредактировал mezmay - 24.12.2012, 21:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iCast
  опции профиля:
сообщение 24.12.2012, 21:54
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 22
Регистрация: 22.9.2012
Пользователь №: 3527

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(mezmay @ 24.12.2012, 22:34) *
Последний break должен быть внутри последнего if'a.
Как-то так:
if (pSocket->bytesAvailable() < nextBlockSize)
{
    qDebug()<<"fail";
    qDebug()<<"bytesAvailable()"<<pSocket->bytesAvailable(); //bytesAvailable() 38
    qDebug()<<"nextBlockSize"<<nextBlockSize; //nextBlockSize 51413
    break;
}

А в твоем варианте до считывания строки просто никогда не дойдет, всегда будет срабатывать break



если все дебаги убрать, то следом идущая строчка выполниться, то есть если убрать дебаги и за условием будет break то все по идее должно работать. Это ладно.
Заключил я тело цикла в кавычки и теперь программа просто уходит в бесконечный цикл. Вот фунцкция отправки строки с сервера и ее вызов где то в конструкторе:

void MainWindow::sendToClientList(QTcpSocket *pSocket, const QString &str)
{
        QByteArray  arrBlock;
        QDataStream out(&arrBlock, QIODevice::WriteOnly);
        out.setVersion(QDataStream::Qt_4_8);
        qDebug()<<"str send"<<str;
        out << quint16(0)<< str;
        out.device()->seek(0);
        out << quint16(arrBlock.size() - sizeof(quint16));
        pSocket->write(arrBlock);
}


...
ui->setupUi(this);
sendToClientList(socket, "hello");
...



Цитата(iCast @ 24.12.2012, 22:53) *
Цитата(mezmay @ 24.12.2012, 22:34) *
Последний break должен быть внутри последнего if'a.
Как-то так:
if (pSocket->bytesAvailable() < nextBlockSize)
{
    qDebug()<<"fail";
    qDebug()<<"bytesAvailable()"<<pSocket->bytesAvailable(); //bytesAvailable() 38
    qDebug()<<"nextBlockSize"<<nextBlockSize; //nextBlockSize 51413
    break;
}

А в твоем варианте до считывания строки просто никогда не дойдет, всегда будет срабатывать break



если все дебаги убрать, то следом идущая строчка выполниться, то есть если убрать дебаги и за условием будет break то все по идее должно работать. Это ладно.
Заключил я тело условия в кавычки и теперь программа просто уходит в бесконечный цикл. Вот фунцкция отправки строки с сервера и ее вызов где то в конструкторе:

void MainWindow::sendToClientList(QTcpSocket *pSocket, const QString &str)
{
        QByteArray  arrBlock;
        QDataStream out(&arrBlock, QIODevice::WriteOnly);
        out.setVersion(QDataStream::Qt_4_8);
        qDebug()<<"str send"<<str;
        out << quint16(0)<< str;
        out.device()->seek(0);
        out << quint16(arrBlock.size() - sizeof(quint16));
        pSocket->write(arrBlock);
}


...
ui->setupUi(this);
sendToClientList(socket, "hello");
...


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 24.12.2012, 22:08
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


напиши вариант который ты реально запускаешь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 24.12.2012, 22:08
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


напиши вариант который ты реально запускаешь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 25.12.2012, 10:21
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

Спасибо сказали: 30 раз(а)




Репутация:   3  


Не забудь на отправляющей стороне сделать flush, иначе данные могут подзависнуть в буфере сокета.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iCast
  опции профиля:
сообщение 25.12.2012, 14:54
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 22
Регистрация: 22.9.2012
Пользователь №: 3527

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(mezmay @ 24.12.2012, 23:08) *
напиши вариант который ты реально запускаешь


void CuteNotes::slotReadyRead()
{
    qDebug()<<"slot ready read activated"; //слот вызывается
    QDataStream in(pSocket);  
    in.setVersion(QDataStream::Qt_4_8);
    forever  
    {
        if ( ! nextBlockSize)  
        {
            if (pSocket->bytesAvailable() < sizeof(quint16))
                break;
            in >> nextBlockSize;
            if (pSocket->bytesAvailable() < nextBlockSize)
                break;
      
       QString str;
       in >> str;  
       qDebug()<<"Str";
       qDebug()<<str;
       nextBlockSize = 0;
    }
}
}


Цитата(ssoft @ 25.12.2012, 11:21) *
Не забудь на отправляющей стороне сделать flush, иначе данные могут подзависнуть в буфере сокета.


к сожалению, это пока не помогло, снова бесконечный цикл.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iCast
  опции профиля:
сообщение 25.12.2012, 15:53
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 22
Регистрация: 22.9.2012
Пользователь №: 3527

Спасибо сказали: 0 раз(а)




Репутация:   0  


вот что еще заметил, при передачи трех раз вот какой дебаг:

pSocket->bytesAvailable() 16 
nextBlockSize 30933

pSocket->bytesAvailable() 32
nextBlockSize 30933

pSocket->bytesAvailable() 48
nextBlockSize 30933
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 25.12.2012, 15:56
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Вот так надо:
void CuteNotes::slotReadyRead()
{
    qDebug()<<"slot ready read activated"; //слот вызывается
    QDataStream in(pSocket);  
    in.setVersion(QDataStream::Qt_4_8);
    forever  
    {
              if ( ! nextBlockSize)  
        {
             if (pSocket->bytesAvailable() < sizeof(quint16))
           break;
        
          in >> nextBlockSize;
          
         }    
              if (pSocket->bytesAvailable() < nextBlockSize)
        break;
      
     QString str;
     in >> str;  
     qDebug()<<"Str";
     qDebug()<<str;
     nextBlockSize = 0;
    }
}

Блин, нормально не редактируется. Ну в общем вынести последнюю часть из if

Сообщение отредактировал mezmay - 25.12.2012, 16:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iCast
  опции профиля:
сообщение 25.12.2012, 16:18
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 22
Регистрация: 22.9.2012
Пользователь №: 3527

Спасибо сказали: 0 раз(а)




Репутация:   0  


void CuteNotes::slotReadyRead()
{
    qDebug()<<"slot activated";
    QDataStream in(pSocket);  
    in.setVersion(QDataStream::Qt_4_8);
    forever  
    {
        if ( ! nextBlockSize)  
        {
            if (pSocket->bytesAvailable() < sizeof(quint16))
            {
                qDebug()<<"fail";
                break;
                }
            in >> nextBlockSize;  
        }
        if (pSocket->bytesAvailable() < nextBlockSize)
        {
             qDebug()<<"fail2";
             qDebug()<<"pSocket->bytesAvailable()"<<pSocket->bytesAvailable();
             qDebug()<<"nextBlockSize"<<nextBlockSize;
             break;  
        }
       QString str;
       in >> str;  
       qDebug()<<str;
       nextBlockSize = 0;
    }
}


После 3 выполнений передачи строки вот что в дебаге:
pSocket->bytesAvailable() 16 
nextBlockSize 59605
slot activated
fail2
pSocket->bytesAvailable() 32
nextBlockSize 59605
slot activated
fail2
pSocket->bytesAvailable() 48
nextBlockSize 59605


По-моему с условиями все так. Осталось в сокете разобраться
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2024, 0:07