[Решено]QTcpSocket получить данные от cisco с 23 порта (telnet)
Здравствуйте!
Есть зоопарк с цисками, у цисок есть порт для управления ими 23, т.е. цепляемся телнетом и управляем . Хочу программкой подключиться как телнетом и считать/записать данные. Ни разу не работал с tcp, подскажите, как правильно считать данные?
- #ifndef CISCO2948_H
- #define CISCO2948_H
- #include <QObject>
- #include <QTcpSocket>
- {
- Q_OBJECT
- public:
- QString currentFortune;
- quint16 m_nNextBlockSize;
- signals:
- public slots:
- void slotReadyRead();
- void slotConnect();
- void slotSendToServer();
- };
- #endif // CISCO2948_H
- #include "cisco2948.h"
- #include "iostream"
- #include <QDebug>
- #include <QTime>
- {
- 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()
- {
- 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::slotConnect()
- {
- m_pTcpSocket->connectToHost("10.255.10.37",23);
- std::cout << "connectToHost\n";
- }
- void cisco2948::slotSendToServer()
- {
- QByteArray arrBlock;
- 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[])
- {
- cisco2948 m;
- return a.exec();
- }
Результат получается:
- connectToHost
- cisco 2948
- slotSendToServer
А хочется чтобы был:
- connectToHost
- cisco 2948
- slotSendToServer
- slotReadyRead
- User Access Verification
- Password:
Подскажите, что не так?
2 replies
Вот, наверняка пригодится – 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;
- qs.toLocal8Bit();
- ba+=qs;
- qDebug()<<ba;
- m_pTcpSocket->write(ba);
- }
И всё чудесно работает :)
You must log in to post a reply. Not a member yet? Register here!
