Russian Qt Forum

Qt => Работа с сетью => Тема начата: knower от Март 21, 2010, 11:59



Название: QtcpSocket получение данных от роутера
Отправлено: 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);                     // но как ?   
}


Название: Re: QtcpSocket получение данных от роутера
Отправлено: 0xFF от Март 21, 2010, 21:24
Код
C++ (Qt)
data2 = out.readAll();
или
Код
C++ (Qt)
while ( out->canReadLine() ) {
data2 = out->readLine();
...
}


Название: Re: QtcpSocket получение данных от роутера
Отправлено: hackoff от Март 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);
    }
}