Как получить ответ от Qtcpsocket?

Модератор: Модераторы разделов

Skala
Сообщения: 241
ОС: Gentoo

Как получить ответ от Qtcpsocket?

Сообщение Skala »

Здравствуйте!
Не могу решить такую задачу: Соединяюсь с QTcpSocket, посылаю команду STAT, и мне приходит пустой ответ.
Проблема усугубляется тем, что пишу GUI-программу. Ее консольный вариант работает нормально.
Если я правильно понял собственный перевод манов ( :-) ), то функция waitForReadyRead, которую я использовал в консольном варианте, может заморозить интерфейс, и лучше вместо нее использовать сигналы. Так и поступил:

Код: Выделить всё

ServerSocket = new QTcpSocket(this);
connect(ServerSocket,SIGNAL(readyRead()),this,SLOT(readFromServer()));
connect(ServerSocket,SIGNAL(connected()),this,SLOT(ConnectedToServer()));
connect(ServerSocket,SIGNAL(error(QAbstractSocket::SocketError )),this,SLOT(errorFromServer(QAbstractSocket::SocketError)));
connect(ServerSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)), this,SLOT(StateChanged(QAbstractSocket::SocketState)));
...

void mainWindow::ConnectedToServer(){
qDebug("Connected!(from slot).");
ServerSocket->write(USER.toAscii());
ServerSocket->write(PASS.toAscii());
ServerSocket->flush();
//Сразу же даю команду:
ServerSocket->write("STAT\n\r");
ServerSocket->flush();
qDebug("reply stat:");
qDebug()<<ReplyFromSocket;
ServerSocket->write("QUIT\n\r");
ServerSocket->flush();
...

void mainWindow::readFromServer(){
qDebug("BeginReading");
QString reply="";
while(ServerSocket->canReadLine())
  reply.append(POPServerSocket->readLine());
ReplyFromSocket = reply;
qDebug("EndReading");
}

В результате у меня такой вывод дебажных сообщений:
Connected!(from slot).
BeginReading
"+OK Hello there.
"
EndReading
reply stat:
"+OK Hello there.
"
BeginReading
"+OK Password required.
"
EndReading
BeginReading
"+OK logged in.
+OK 24 337918
+OK Bye-bye.
"
EndReading
Там, где предполагается, что будет ответ от STAT в глобальной переменной ReplyFromSocket, приходит пустое значение.
Перепробовал разные варианты. Как на самом деле нужно получать ответы от QTcpSocket?
P.S.
Qt: 4.3b
Спасибо за внимание.
Спасибо сказали:
Skala
Сообщения: 241
ОС: Gentoo

Re: Как получить ответ от Qtcpsocket?

Сообщение Skala »

В общем сделал так:

Код: Выделить всё

QTextStream out(ServerSocket);
out<<messageToServer<<endl;
ReplyFromSocket = waitForReplyAndTakethis( );
...
QString mainWindow::waitForReplyAndTakethis(  ){
//waitForReply
QString re = "";
do{
    ServerSocket->waitForReadyRead(500);
}while (ServerSocket->bytesAvailable()==0);
//and Take This
re = ServerSocket->readAll();
return re;
}
Хорошо ли плохо ли- не знаю. Вроде работает.
Спасибо за внимание.
Спасибо сказали:
TwisT
Сообщения: 265
ОС: Debian

Re: Как получить ответ от Qtcpsocket?

Сообщение TwisT »

т.е. ты ждешь 500 мс
и даже если данные прочитаны не полностью продолжаешь работу?
Может нужно ждать пока все не придет?
Linux user #432536.
Спасибо сказали:
Skala
Сообщения: 241
ОС: Gentoo

Re: Как получить ответ от Qtcpsocket?

Сообщение Skala »

TwisT писал(а):
18.05.2007 21:46
Может нужно ждать пока все не придет?
Тогда программа подвисает =(
Спасибо за внимание.
Спасибо сказали:
TwisT
Сообщения: 265
ОС: Debian

Re: Как получить ответ от Qtcpsocket?

Сообщение TwisT »

ну, батенька, а зачем тогда по вашему потоки придумали?
замечательная вещь знаете ли
Linux user #432536.
Спасибо сказали:
Skala
Сообщения: 241
ОС: Gentoo

Re: Как получить ответ от Qtcpsocket?

Сообщение Skala »

TwisT писал(а):
19.05.2007 09:45
ну, батенька, а зачем тогда по вашему потоки придумали?
замечательная вещь знаете ли
Подскажите, пожалуйста, как правильно получать при помощи потоков? Не могу осилить этот пункт :blush:
Спасибо за внимание.
Спасибо сказали:
TwisT
Сообщения: 265
ОС: Debian

Re: Как получить ответ от Qtcpsocket?

Сообщение TwisT »

Скажу сразу что Qt 4-ю я еще не юзал, так что могут быть отличия
На сколько я понял пишешь клиент. Итак, лепим поток:
наследуешь от QThread, в ассистанте там даже пример был
переписываешь метод void run(),в нем как раз и должна находится работа с сокетами
единственный гемор в Qt это межпоточное взаимодействие, но в 4 вроде проблемы разрешили,
тебе ведь нужно будет параметры передать в новый поток. В 4 это делается по средством событий
ты искуственно создаешь событие, а в нашем свежеиспеченном потоке находится обработчик
который получает все данные необходимые для работы с сетью.
Можно в принципе по тупому через файл.
Но если пишешь чисто для LINUX-a,то новый поток проше сделать штатными средствами LINUX imho проще
Все подробности есть в книгах
Удачи!
Linux user #432536.
Спасибо сказали:
Skala
Сообщения: 241
ОС: Gentoo

Re: Как получить ответ от Qtcpsocket?

Сообщение Skala »

TwisT писал(а):
20.05.2007 19:49
наследуешь от QThread, в ассистанте там даже пример был
переписываешь метод void run(),в нем как раз и должна находится работа с сокетами


Помогите разпутаться. У меня, в отличие от примера, сервер и порт задаются в программе юзером, поэтому решил сперва написать "скелет" QThread, чтобы потом на него "накручивать" разные функции. Скелет такой:

class MyThread : public QThread
{
Q_OBJECT
public:
MyThread(QObject *parent = 0);
~MyThread();
void run();
}

MyThread::MyThread(QObject *parent)
: QThread(parent)
{
}

void MyThread::run(){
}

MyThread::~MyThread(){
}

Т.е.- в будущем соответственно собирался передавать в него адрес сервера, порт и т.п. Перенес это все в отдельные файлы, компилирую. И выдается ошибка:
wpopserver.h:4: ошибка: invalid use of undefined type ‘struct QThread’
/usr/include/qt4/QtCore/qobject.h:48: ошибка: forward declaration of ‘struct QThread’
wpopserver.h:4: предупреждение: ‘class MyThread’ has virtual functions but non-virtual destructor
moc_wpopserver.cpp:37: ошибка: неполный тип ‘QThread’ использован во вложенном спецификаторе имени
moc_wpopserver.cpp: In member function ‘virtual void* MyThread::qt_metacast(const char*)’:
moc_wpopserver.cpp:51: ошибка: неполный тип ‘QThread’ использован во вложенном спецификаторе имени
moc_wpopserver.cpp: In member function ‘virtual int MyThread::qt_metacall(QMetaObject::Call, int, void**)’:
moc_wpopserver.cpp:56: ошибка: неполный тип ‘QThread’ использован во вложенном спецификаторе имени
make: *** [moc_wpopserver.o] Error 1
Не понимаю, что за "не полный тип". Подскажите, в чем может быть ошибка?
Спасибо за внимание.
Спасибо сказали:
TwisT
Сообщения: 265
ОС: Debian

Re: Как получить ответ от Qtcpsocket?

Сообщение TwisT »

зачем макрос
Q_OBJECT
при обьявлении класса, нету его тута
давай в асю а то так будем 3 года разгребатся
Linux user #432536.
Спасибо сказали:
Аватара пользователя
halturin
Сообщения: 167
ОС: Linux

Re: Как получить ответ от Qtcpsocket?

Сообщение halturin »

а что в QT у потоков не одно и то же адресное пространство? :wacko: о каком межпоточном взаимодействии идет речь?
Спасибо сказали: