Russian Qt Forum
Ноябрь 23, 2024, 15:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QtcpSocket получение данных от роутера  (Прочитано 4149 раз)
knower
Гость
« : Март 21, 2010, 11:59 »

устанавливаем содеинение с модемом (через telnet 23 порт)
данные модему уходят а вот как прочитать что он мне прислал не очень получается В замешательстве
подскажите пож-ста
вот кусок кода
connect(&tcpSocket,SIGNAL(connected()),this,SLOT(con()));
..
void avangard::connectToDsl(){
   tcpSocket.connectToHost("192.168.1.1",23);

}
void  avangard::con()
{   
    QByteArray block;
    QDataStream in(&block,QIODevice::WriteOnly);
    in<<"admin";
    tcpSocket.write(block);
}
здесь получаем данные от модема
void avangard::mes4(){                           
   QString data2;
   QDataStream out(&tcpSocket);
   out>>data2;                                          // здесь надо сделать проверку все ли мы получили
   ui.textEdit->setText(data2);                     // но как ?   
}
Записан
0xFF
Гость
« Ответ #1 : Март 21, 2010, 21:24 »

Код
C++ (Qt)
data2 = out.readAll();
или
Код
C++ (Qt)
while ( out->canReadLine() ) {
data2 = out->readLine();
...
}
Записан
hackoff
Гость
« Ответ #2 : Март 22, 2010, 03:39 »

Чтение данных:
Код:
//Чтение из сокета /SLOT
void connectionTCP::ready_read(){
    while(messengeChek())
    {
        qint32 sizeData=0;
        QByteArray data;
        // читаем 4 байта и проверяем их
        qint64 readed = this->read((char*) &sizeData, sizeof(sizeData));
        if((sizeof(sizeData)==readed) && (sizeData>0))
        {
            // считываем остальные данные
            data = this->read(sizeData);
            if(data.size() != sizeData)
            {
                // error!!!
                // disconnect,  ...
                return;
            }
            analysisPackge(data);
        }
    }
}

//Проверка целостности сообщения
bool connectionTCP::messengeChek(){
    qint32 minRead=0;
    qint64 bytesDataAvailable = this->bytesAvailable();
    //Мало данных
    if(bytesDataAvailable < sizeof(minRead)) return false;

    //Читаем 4 байта и проверяем
    qint64 peekSize = this->peek((char*)&minRead, sizeof(minRead));
    if(peekSize != sizeof(minRead)) return false;

    if(0 == minRead)
    {
        this->read(4); // пустой пакет
        return false;
    }

    //Проверяем пришли ли все данные
    bytesDataAvailable = this->bytesAvailable();
    if(bytesDataAvailable < sizeof(minRead) + minRead) return false;
    //Усе ухорошо :)
    return true;
}

//Разбор пакета
void connectionTCP::analysisPackge(QByteArray &data){
    QDataStream tmp(&data, QIODevice::ReadOnly);
    tmp.setVersion(QDataStream::Qt_4_6);
    QString cmd;
    tmp>>cmd;
    if (cmd==QString("onMyScreen")){
        tmp>>pixmapScreen;
        tmp>>cmd;
        if (cmd!=QString("end")){
            //            emitDisconnect();
            return;
        }
        emit addScreenThread(&pixmapScreen);
        return;
    }

    if (cmd==QString("myNameIs")){
        tmp>>myNameIs;
        emit myNames(myNameIs);
        return;
    }

    if (cmd==QString("HelloFriend")){
        tmp>>myNameIs;
//        myNameIs.append("lasdfjlsajfljsadlfjsaldfjlsjdfl;asdfjlsdjflasjflsdfsdf");
//        connectTrue();
        emit connectTrue(this);
        return;
    }


    //    emitDisconnect();
}




Запись данных


Код:

void connectionTCP::sendData(QByteArray &data){
//QByteArray &data сериализованные данные

    qint32 sizeData = data.size();
    if (sizeData){
        this->write((char*) &sizeData, sizeof(sizeData));
        this->write(data);
    }
}

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.09 секунд. Запросов: 20.