crossplatform.ru

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

5 страниц V  « < 2 3 4 5 >  
Ответить в данную темуНачать новую тему
> Ожидание чтения и сокращение загрузки процессора.
LE0N
  опции профиля:
сообщение 28.3.2009, 10:39
Сообщение #31


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 10.3.2009
Из: Беларусь
Пользователь №: 604

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




Репутация:   0  


Цитата
А когда тогда не рано? Если никуда не лездь, то ничему и не научишься. Нужно стремиться к новым знаниям

Ни кто с этим не спорит. Но на мой взгляд, он должен сначала решить эту же задачу без наворотов...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dasV
  опции профиля:
сообщение 6.4.2009, 11:43
Сообщение #32


Студент
*

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

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




Репутация:   0  


Добрый день уважаемые, только что вернулся из анабиоза.

igor_bogomolov я сделал (точнее попытался сделать) как Вы и сказали через canReadLine() однако столкнулся с недопониманием (не докурил) вот какого момента (информацию о котором не смог найти).

Скажите если мы не можем прочитать строку, это может значить что мы прочитали все что нам прислали?
То есть нам надо определить, или мы действительно не можем прочитать строку (а значит, нам надо бы подождать) или второй вариант, нам уже все прислали и надо обрабатывать строки?

Вторая проблема вытекающая из первой, с которой столкнулся, это то, что на последнюю строку canReadLine() выдает false, хотя если вызывать принудительно ReadLine() выдает последнюю строку... не понятно так как если подождать, socketReadyRead() повторно не вызывается =(.

Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 6.4.2009, 12:19
Сообщение #33


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


У вас хоть какой-то протокол общения с сервером есть? Не возвращается ли в самом начале сколько байт будет передано? Или завершающая последовательность какая-нибудь есть? Или вы отправляете команду и сервер начинает сыпать неизвестно чего и сколько

// add
Можно убрать проверку canReadLine, и считывать все что приходит в буфер. При этом должен быть какой-то таймаут. Если в течении этого таймаута ничего не пришло, то считаем что все данные получены, и идем на оьработку

Сообщение отредактировал igor_bogomolov - 6.4.2009, 12:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dasV
  опции профиля:
сообщение 6.4.2009, 12:44
Сообщение #34


Студент
*

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

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




Репутация:   0  


Добрый день.

Протокол общения обычный http, я знаю, сколько мне передадут или должны передать (так как есть Content-Length: который я обрабатываю) и получаю длину, которую пока не обрабатываю.

Но это все ерунда полная (хотя и интересная), мне важно узнать, по какой причине socket не пишет на сервер второй раз =(

Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 6.4.2009, 12:57
Сообщение #35


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата(dasV @ 6.4.2009, 13:44) *
я знаю, сколько мне передадут или должны передать
Так если вы знаете сколько быйт вы должны принять в ответ на свою команду, то проблем вообще быть не должно. Просто отслеживаете количество принятых данных и все.
Цитата(dasV @ 6.4.2009, 13:44) *
Но это все ерунда полная (хотя и интересная), мне важно узнать, по какой причине socket не пишет на сервер второй раз =(
Вот тут я ничего не понял. О чем речь, что за ерунда? Что значит не пишет второй раз? Сформулируйте вопросс точнее. Еще лучьше коды приложите.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dasV
  опции профиля:
сообщение 6.4.2009, 13:25
Сообщение #36


Студент
*

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

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




Репутация:   0  


Да я действительно не очень…ммм, не очень корректно написал.

Проблема моей программы (и соответственно моей безграмотности) заключается в том, что в случае повторной отсылки GET запроса на сервер (state == CloseSession) , ничего не происходит, то есть запрос просто не передается!

qlonglong ssl_class::WriteMsgToSrv()
{
    QString tmp;        //не обязательно, убрать.
    qlonglong i;            //не обязательно, убрать.
    switch(state)
    {
        case(StartSession):
        {
            tmp="GET "+get+"/StartSession?Login="+login+"&Password="+password+"&Gmt=3 \r\n";
            break;
        }
        case(CloseSession):
        {
            tmp="GET "+get+"/CloseSession?SessionID="+ QString::number(SessionID)+" \r\n";
            break;
        }
    }
i= socket.write( tmp.toUtf8() );
socket.flush ();                
return( i );
}


Я к сожалению не хочу позорится, если Вы дадите почту я перешлю весь код.

Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 6.4.2009, 13:29
Сообщение #37


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(dasV @ 6.4.2009, 17:25) *
Я к сожалению не хочу позорится,
да ладно тебе.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 6.4.2009, 14:59
Сообщение #38


Дмитрий Трошин
****

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

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




Репутация:   6  


Цитата(Litkevich Yuriy @ 6.4.2009, 14:29) *
Цитата(dasV @ 6.4.2009, 17:25) *
Я к сожалению не хочу позорится,
да ладно тебе.

да ладно, нормальный комплекс. Самое удивительное, он полезный :)
плохо то, что помочь не могу, а код посмотреть хочется, тоже с такой задачОЙ бду заморачиваться...

Сообщение отредактировал trdm - 6.4.2009, 15:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 6.4.2009, 15:53
Сообщение #39


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Приложите еще хотябы код метода в котором вы считываете данные с соккета.

Цитата(dasV @ 6.4.2009, 14:25) *
case(CloseSession):
{
tmp="GET "+get+"/CloseSession?SessionID="+ QString::number(SessionID)+" \r\n";
break;
}

Добавьте здесь
qDebug() << socket.state();
qDebug() << socket.errorString () ;
чтобы посмотреть состояние подключения на момент передачи второй команды. В общем надо убедиться что соединение не закрыто на момент второй передачи.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dasV
  опции профиля:
сообщение 6.4.2009, 16:34
Сообщение #40


Студент
*

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

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




Репутация:   0  


То же самое, к сожалению, результат вывода примерно следующий

Первый раз

QAbstractSocket::ConnectedState
"Unknown error"
MSG : Connected State is = 3
//i= socket.write( tmp.toUtf8() ) ;
//socket.flush ();
MSG : Connected State is = 3

Второй раз

QAbstractSocket::ConnectedState
"Unknown error"
MSG : Connected State is = 3
//i= socket.write( tmp.toUtf8() ) ;
//socket.flush ();
MSG : Connected State is = 3



Раскрывающийся текст

qlonglong ssl_class::WriteMsgToSrv()
{
    QString tmp;
    qlonglong i;
    switch(state)
    {
        case(StartSession):
        {
            tmp="GET "+get+"/StartSession?Login="+login+"&Password="+password+"&Gmt=3 \r\n";
            break;
        }

        case(CloseSession):
        {
            tmp="GET "+get+"/CloseSession?SessionID="+ QString::number(SessionID)+" \r\n";
            break;
        }
    }
            qDebug() << socket.state();
            qDebug() << socket.errorString ();

emit displayMessage("MSG : Connected State is = " + QString::number( QAbstractSocket::ConnectedState) );

i= socket.write( tmp.toUtf8() );
socket.flush ();

emit displayMessage("MSG : Connected State is = " + QString::number( QAbstractSocket::ConnectedState) );

return( i );

}



Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.11.2024, 20:40