[Решено]QTcpSocket получить данные от cisco с 23 порта (telnet)



  • Здравствуйте!
    Есть зоопарк с цисками, у цисок есть порт для управления ими 23, т.е. цепляемся телнетом и управляем . Хочу программкой подключиться как телнетом и считать/записать данные. Ни разу не работал с tcp, подскажите, как правильно считать данные?

    @
    #ifndef CISCO2948_H
    #define CISCO2948_H

    #include <QObject>
    #include <QTcpSocket>

    class cisco2948 : public QObject
    {
    Q_OBJECT
    public:
    explicit cisco2948(QObject *parent = 0);
    QTcpSocket *m_pTcpSocket;
    QString currentFortune;
    quint16 m_nNextBlockSize;

    signals:

    public slots:
    void slotReadyRead();
    void slotError(QAbstractSocket::SocketError);
    void slotConnect();
    void slotSendToServer();

    };

    #endif // CISCO2948_H
    @

    @
    #include "cisco2948.h"
    #include "iostream"
    #include <QDebug>
    #include <QTime>

    cisco2948::cisco2948(QObject *parent) :
    QObject(parent)
    {
    m_pTcpSocket = new QTcpSocket(this);
    QObject::connect(m_pTcpSocket,SIGNAL(readyRead()),this,SLOT(slotReadyRead()));
    QObject::connect(m_pTcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(slotError(QAbstractSocket::SocketError)));
    this->slotConnect();
    std::cout << "cisco 2948\n";
    this->slotSendToServer();
    }

    void cisco2948::slotReadyRead()
    {
    QDataStream in(m_pTcpSocket);
    for (;;) {
    if (!m_nNextBlockSize) {
    if (m_pTcpSocket->bytesAvailable() < sizeof(quint16)) {
    break;
    }
    in >> m_nNextBlockSize;
    }

        if (m_pTcpSocket->bytesAvailable() < m_nNextBlockSize) {
            break;
        }
        std::cout << "slotReadyRead\n";
        QTime time;
        QString str;
        in >> time >> str;
        qDebug() << time.toString() << " " << str;
        m_nNextBlockSize = 0;
    }
    

    }

    void cisco2948::slotError(QAbstractSocket::SocketError)
    {

    }

    void cisco2948::slotConnect()
    {
    m_pTcpSocket->connectToHost("10.255.10.37",23);
    std::cout << "connectToHost\n";
    }

    void cisco2948::slotSendToServer()
    {
    QByteArray arrBlock;
    QDataStream out(&arrBlock, QIODevice::WriteOnly);
    out << quint16(0) << "\n";
    out.device()->seek(0);
    out << quint16(arrBlock.size() - sizeof(quint16));
    m_pTcpSocket->write(arrBlock);
    std::cout << "slotSendToServer\n";
    }
    @

    @
    #include <QtCore/QCoreApplication>
    #include "cisco2948.h"

    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);

    cisco2948 m;
    
    return a.exec(&#41;;
    

    }
    @

    Результат получается:
    @
    connectToHost
    cisco 2948
    slotSendToServer
    @

    А хочется чтобы был:
    @
    connectToHost
    cisco 2948
    slotSendToServer
    slotReadyRead

    User Access Verification
    Password:
    @

    Подскажите, что не так?



  • Вот, наверняка пригодится - http://code.google.com/p/qtelnetperso/ - там и исходник есть и примеры работы с telnet.

    Единственное что у меня пока не получилось сделать так это работу с telnet в пассивном режиме, а именно в таком режиме, как выяснилось опытным путем через Putty, нужно работать c имеющимся оборудованием, а иначе сервер отключает клиентскую программу и закрывает соединение при попытке отправить какую-либо команду. Конкретно к циске подключаться не пробовал, и возможно вас эта проблема не коснется, и все сразу заработает нормально.



  • Спасибо, посмотрел исходники, поправил свои:

    @void cisco2948::slotReadyRead()
    {
    buffer.clear();
    buffer.append(m_pTcpSocket->readAll());
    QString str;
    str = buffer.data();
    qDebug() << str;
    if (str.contains("Password: ")) {

        std::cout << "true";
        slotSendToServer();
    }
    

    }@

    @void cisco2948::slotSendToServer()
    {
    QByteArray ba;
    QString qs= "парольотмоейциски\n";
    qs.toLocal8Bit();
    ba+=qs;
    qDebug()<<ba;
    m_pTcpSocket->write(ba);
    }@

    И всё чудесно работает :)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.