Russian Qt Forum

Qt => Работа с сетью => Тема начата: azin от Октябрь 11, 2012, 10:35



Название: Контакт по TCP\IP
Отправлено: azin от Октябрь 11, 2012, 10:35
Есть некое устройство, которое мониторится по телнету (putty). Клиент из примеров (MyClient)
коннектится, но не хочет получать от него данных. В чем хитрость?
Заранее благодарю!
 


Название: Re: Контакт по TCP\IP
Отправлено: Bepec от Октябрь 11, 2012, 10:44
Есть некая ошибочка у вас. Есть некое сообщение у вас. Некая ошибочка в неком сообщении в некой сценке можно решить неким способом :)

Клиент из примеров - MyClient  - такого я чегой то не нашёл :)


Название: Re: Контакт по TCP\IP
Отправлено: azin от Октябрь 11, 2012, 13:29
Вот определение   

 m_pTcpSocket = new QTcpSocket(this);
   
    m_pTcpSocket->connectToHost(strHost, nPort);
    connect(m_pTcpSocket, SIGNAL(connected()), SLOT(slotConnected()));
    connect(m_pTcpSocket, SIGNAL(readyRead()), SLOT(slotReadyRead()));
    connect(m_pTcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
            this,         SLOT(slotError(QAbstractSocket::SocketError))
           );

slotConnected срабатывает нормально, устройство передает "Username:".
slotReadyRead получает пустую строку и все зависает.


Название: Re: Контакт по TCP\IP
Отправлено: Bepec от Октябрь 11, 2012, 13:33
А что зависает?

Приходит сигнал, что можно считать данные. Вы читаете данные. В чём проблема?


Название: Re: Контакт по TCP\IP
Отправлено: azin от Октябрь 11, 2012, 13:59
Вот процедура slotReadyRead

    quint16     m_nNextBlockSize;

   QDataStream in(m_pTcpSocket);
    in.setVersion(QDataStream::Qt_4_5);
    for (;;) {
        if (!m_nNextBlockSize) {
            if (m_pTcpSocket->bytesAvailable() < sizeof(quint16)) {
                break;
            }
            in >> m_nNextBlockSize;
        }

        if (m_pTcpSocket->bytesAvailable() < m_nNextBlockSize) {
            break;
        }
        QTime   time;
        QString str;
        in >> time >> str;

        m_ptxtInfo->append(time.toString() + " " + str);
        m_nNextBlockSize = 0;
    }
она активизируется один раз при коннекте, bytesAvailable=0, str="".
Хотя Putty получает "Usermame:" и далее на передачи не реагирует.
Складывается впечатление, что они не понимают форматы друг друга.


Название: Re: Контакт по TCP\IP
Отправлено: mutineer от Октябрь 11, 2012, 15:37
А телнет перед каждым пакетом отправляет его размер в виде quint16?
А потому еще и время/строку передает в Qt-формате?


Название: Re: Контакт по TCP\IP
Отправлено: Serr500 от Октябрь 11, 2012, 16:29
Есть некое устройство, которое мониторится по телнету (putty).
Так telnet или putty? Putty по умолчанию устанавливает SSH-соединение (с шифрованием).


Название: Re: Контакт по TCP\IP
Отправлено: Fregloin от Октябрь 16, 2012, 17:15
здесь QDataStream не прокатит, так как приемная сторона не написана на Qt, и QDataStream там нет вообще.
клеить пакетики вручную, определить критерий завершенности пакета (например \0), и формировать свои сообщения в той же манере.
Я вообще избегаю QDataStream в передаче данных, ибо не подходит для передачи данных для неQt клиентов.


Название: Re: Контакт по TCP\IP
Отправлено: azin от Октябрь 18, 2012, 08:47
Сработало!
Всем спасибо!