crossplatform.ru

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


  Ответ в Теряются данные в сокете
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
iCast Дата 26.12.2012, 21:50
  nextBlockSize =0;
iCast Дата 26.12.2012, 12:38
  опять проблемы, почему то теперь данные вообще не прияходят от сервера к клиенту.
Сервер.(отправляет список)
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 Дата 25.12.2012, 18:29
 
Цитата(mezmay @ 25.12.2012, 17:37) *
1. Зачем все время разный код пишешь? Последний вариант нормальный.
2. Проверь значение quint16(arrBlock.size() - sizeof(quint16)); перед записью
3. Проверь что перед циклом nextBlockSize проинициализирован нулем


Спасибо :) nextBlockSize=0 помогло:)
mezmay Дата 25.12.2012, 16:37
  1. Зачем все время разный код пишешь? Последний вариант нормальный.
2. Проверь значение quint16(arrBlock.size() - sizeof(quint16)); перед записью
3. Проверь что перед циклом nextBlockSize проинициализирован нулем
iCast Дата 25.12.2012, 16:18
 
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 Дата 25.12.2012, 15:56
  Вот так надо:
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 Дата 25.12.2012, 15:53
  вот что еще заметил, при передачи трех раз вот какой дебаг:

pSocket->bytesAvailable() 16 
nextBlockSize 30933

pSocket->bytesAvailable() 32
nextBlockSize 30933

pSocket->bytesAvailable() 48
nextBlockSize 30933
iCast Дата 25.12.2012, 14:54
 
Цитата(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, иначе данные могут подзависнуть в буфере сокета.


к сожалению, это пока не помогло, снова бесконечный цикл.
ssoft Дата 25.12.2012, 10:21
  Не забудь на отправляющей стороне сделать flush, иначе данные могут подзависнуть в буфере сокета.
mezmay Дата 24.12.2012, 22:08
  напиши вариант который ты реально запускаешь
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 27.4.2024, 21:00