Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Теряются данные в сокете
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
iCast
Привет, сервер отправляет строку клиенту,но до клиента строка не доходит. Передаю строку: "==="
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
Последний break должен быть внутри последнего if'a.
Как-то так:
if (pSocket->bytesAvailable() < nextBlockSize)
{
    qDebug()<<"fail";
    qDebug()<<"bytesAvailable()"<<pSocket->bytesAvailable(); //bytesAvailable() 38
    qDebug()<<"nextBlockSize"<<nextBlockSize; //nextBlockSize 51413
    break;
}

А в твоем варианте до считывания строки просто никогда не дойдет, всегда будет срабатывать break
iCast
Цитата(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
напиши вариант который ты реально запускаешь
mezmay
напиши вариант который ты реально запускаешь
ssoft
Не забудь на отправляющей стороне сделать flush, иначе данные могут подзависнуть в буфере сокета.
iCast
Цитата(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
вот что еще заметил, при передачи трех раз вот какой дебаг:

pSocket->bytesAvailable() 16 
nextBlockSize 30933

pSocket->bytesAvailable() 32
nextBlockSize 30933

pSocket->bytesAvailable() 48
nextBlockSize 30933
mezmay
Вот так надо:
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
iCast
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


По-моему с условиями все так. Осталось в сокете разобраться
mezmay
1. Зачем все время разный код пишешь? Последний вариант нормальный.
2. Проверь значение quint16(arrBlock.size() - sizeof(quint16)); перед записью
3. Проверь что перед циклом nextBlockSize проинициализирован нулем
iCast
Цитата(mezmay @ 25.12.2012, 17:37) *
1. Зачем все время разный код пишешь? Последний вариант нормальный.
2. Проверь значение quint16(arrBlock.size() - sizeof(quint16)); перед записью
3. Проверь что перед циклом nextBlockSize проинициализирован нулем


Спасибо :) nextBlockSize=0 помогло:)
iCast
опять проблемы, почему то теперь данные вообще не прияходят от сервера к клиенту.
Сервер.(отправляет список)
void MainWindow::sendToClientList(QTcpSocket *pSocket, const QStringList &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));
        //qDebug()<<quint16(arrBlock.size() - sizeof(quint16));

        pSocket->write(arrBlock);
        pSocket->flush();
}

Клиент.(принимает список)
void CuteNotes::slotReadyRead()
{
     nextBlockSize =0;
    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;
    }
}


никак не пойму, что не так делаю.
iCast
nextBlockSize =0;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2018 IPS, Inc.