Здравствуйте, гость ( Вход | Регистрация )
dasV | Дата 7.4.2009, 18:36 |
Похоже, что так оно и есть, после получения данных и повторной попытки записи, не происходит закрытие socket, видимо его принудительно надо закрывать, так как это ssl соединении а работаем мы с http. Сейчас проверил, что выдает socket.waitForReadyRead(60000) “не пугайтесь это из моего гениального творения, без слотов =)” при попытке повторного чтения, и выяснил что waitForReadyRead QAbstractSocket::UnconnectedState waitForReadyRead "Remote host closed"
самое интересное что openMode() выдает “MSG : Open Mode 3” то есть у нас все хорошо =) То есть нам надо будет делать socket.close(); после получения ответа от сервера. Буду курить носки и много думать, привет анабиоз =) |
|
Sokoloff | Дата 6.4.2009, 18:09 |
Добрый день. Протокол общения обычный 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 Раскрывающийся текст
Спасибо. |
|
igor_bogomolov | Дата 6.4.2009, 15:53 |
Приложите еще хотябы код метода в котором вы считываете данные с соккета. 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, 13:29 |
Я к сожалению не хочу позорится, да ладно тебе. |
|
dasV | Дата 6.4.2009, 13:25 |
Да я действительно не очень…ммм, не очень корректно написал. Проблема моей программы (и соответственно моей безграмотности) заключается в том, что в случае повторной отсылки GET запроса на сервер (state == CloseSession) , ничего не происходит, то есть запрос просто не передается!
Я к сожалению не хочу позорится, если Вы дадите почту я перешлю весь код. Спасибо. |
|
igor_bogomolov | Дата 6.4.2009, 12:57 |
я знаю, сколько мне передадут или должны передать Так если вы знаете сколько быйт вы должны принять в ответ на свою команду, то проблем вообще быть не должно. Просто отслеживаете количество принятых данных и все.Но это все ерунда полная (хотя и интересная), мне важно узнать, по какой причине socket не пишет на сервер второй раз =( Вот тут я ничего не понял. О чем речь, что за ерунда? Что значит не пишет второй раз? Сформулируйте вопросс точнее. Еще лучьше коды приложите. |
|
dasV | Дата 6.4.2009, 12:44 |
Добрый день. Протокол общения обычный http, я знаю, сколько мне передадут или должны передать (так как есть Content-Length: который я обрабатываю) и получаю длину, которую пока не обрабатываю. Но это все ерунда полная (хотя и интересная), мне важно узнать, по какой причине socket не пишет на сервер второй раз =( Спасибо. |
|
igor_bogomolov | Дата 6.4.2009, 12:19 |
У вас хоть какой-то протокол общения с сервером есть? Не возвращается ли в самом начале сколько байт будет передано? Или завершающая последовательность какая-нибудь есть? Или вы отправляете команду и сервер начинает сыпать неизвестно чего и сколько // add Можно убрать проверку canReadLine, и считывать все что приходит в буфер. При этом должен быть какой-то таймаут. Если в течении этого таймаута ничего не пришло, то считаем что все данные получены, и идем на оьработку |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 26.4.2024, 1:08 |