crossplatform.ru

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


  Ответ в Ожидание чтения и сокращение загрузки процессора.
Введите ваше имя
Подтвердите код

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

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


Последние 10 сообщений [ в обратном порядке ]
dasV Дата 7.4.2009, 18:36
  Похоже, что так оно и есть, после получения данных и повторной попытки записи, не происходит закрытие socket, видимо его принудительно надо закрывать, так как это ssl соединении а работаем мы с http.
Сейчас проверил, что выдает socket.waitForReadyRead(60000) “не пугайтесь это из моего гениального творения, без слотов =)” при попытке повторного чтения, и выяснил что

waitForReadyRead QAbstractSocket::UnconnectedState
waitForReadyRead "Remote host closed"

QString Sms_class::ReadSocket()
{
    out<<"MSG : Open Mode " <<socket.openMode ()<<endl;
    
    if(!socket.waitForReadyRead(60000))
        {
            qDebug() <<"waitForReadyRead"<< socket.state();
            qDebug() <<"waitForReadyRead"<< socket.errorString ();        
            return(0);
        }
    return(socket.readAll());
}


самое интересное что openMode() выдает “MSG : Open Mode 3” то есть у нас все хорошо =)

То есть нам надо будет делать socket.close(); после получения ответа от сервера.

Буду курить носки и много думать, привет анабиоз =)
Sokoloff Дата 6.4.2009, 18:09
 
Цитата(dasV @ 6.4.2009, 13:44) *
Добрый день.

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

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

Спасибо.


Сам я с QT только разбираюсь, поэтому кодом помочь не могу, но опыт работы с HTTP есть, может помогут следующие идеи.
HTTP - это протокол без поддержки сессий, т.е. запрос/получение страницы отдельная tcp сессия. Поэтому когда tcp сессия закрылась, значит получили все данные. Темболее, что поле content-length может и не присутьствовать в http заголовке.
dasV Дата 6.4.2009, 16:34
  То же самое, к сожалению, результат вывода примерно следующий

Первый раз

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 );

}



Спасибо.
igor_bogomolov Дата 6.4.2009, 15:53
  Приложите еще хотябы код метода в котором вы считываете данные с соккета.

Цитата(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 () ;
чтобы посмотреть состояние подключения на момент передачи второй команды. В общем надо убедиться что соединение не закрыто на момент второй передачи.
trdm Дата 6.4.2009, 14:59
 
Цитата(Litkevich Yuriy @ 6.4.2009, 14:29) *
Цитата(dasV @ 6.4.2009, 17:25) *
Я к сожалению не хочу позорится,
да ладно тебе.

да ладно, нормальный комплекс. Самое удивительное, он полезный :)
плохо то, что помочь не могу, а код посмотреть хочется, тоже с такой задачОЙ бду заморачиваться...
Litkevich Yuriy Дата 6.4.2009, 13:29
 
Цитата(dasV @ 6.4.2009, 17:25) *
Я к сожалению не хочу позорится,
да ладно тебе.
dasV Дата 6.4.2009, 13:25
  Да я действительно не очень…ммм, не очень корректно написал.

Проблема моей программы (и соответственно моей безграмотности) заключается в том, что в случае повторной отсылки 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 );
}


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

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

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

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

Спасибо.
igor_bogomolov Дата 6.4.2009, 12:19
  У вас хоть какой-то протокол общения с сервером есть? Не возвращается ли в самом начале сколько байт будет передано? Или завершающая последовательность какая-нибудь есть? Или вы отправляете команду и сервер начинает сыпать неизвестно чего и сколько

// add
Можно убрать проверку canReadLine, и считывать все что приходит в буфер. При этом должен быть какой-то таймаут. Если в течении этого таймаута ничего не пришло, то считаем что все данные получены, и идем на оьработку
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 13:16