July 12, 2012

_KUL _KUL
Lab Rat
5 posts

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

 

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

  1. #ifndef CISCO2948_H
  2. #define CISCO2948_H
  3.  
  4. #include <QObject>
  5. #include <QTcpSocket>
  6.  
  7. class cisco2948 : public QObject
  8. {
  9.     Q_OBJECT
  10. public:
  11.     explicit cisco2948(QObject *parent = 0);
  12.     QTcpSocket *m_pTcpSocket;
  13.     QString currentFortune;
  14.     quint16 m_nNextBlockSize;
  15.    
  16. signals:
  17.    
  18. public slots:
  19.     void slotReadyRead();
  20.     void slotError(QAbstractSocket::SocketError);
  21.     void slotConnect();
  22.     void slotSendToServer();
  23.    
  24. };
  25.  
  26. #endif // CISCO2948_H  

  1. #include "cisco2948.h"
  2. #include "iostream"
  3. #include <QDebug>
  4. #include <QTime>
  5.  
  6. cisco2948::cisco2948(QObject *parent) :
  7.     QObject(parent)
  8. {
  9.     m_pTcpSocket = new QTcpSocket(this);
  10.     QObject::connect(m_pTcpSocket,SIGNAL(readyRead()),this,SLOT(slotReadyRead()));
  11.     QObject::connect(m_pTcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(slotError(QAbstractSocket::SocketError)));
  12.     this->slotConnect();
  13.     std::cout << "cisco 2948\n";
  14.     this->slotSendToServer();
  15. }
  16.  
  17. void cisco2948::slotReadyRead()
  18. {
  19.     QDataStream in(m_pTcpSocket);
  20.     for (;;) {
  21.         if (!m_nNextBlockSize) {
  22.             if (m_pTcpSocket->bytesAvailable() < sizeof(quint16)) {
  23.                 break;
  24.             }
  25.             in >> m_nNextBlockSize;
  26.         }
  27.  
  28.         if (m_pTcpSocket->bytesAvailable() < m_nNextBlockSize) {
  29.             break;
  30.         }
  31.         std::cout << "slotReadyRead\n";
  32.         QTime time;
  33.         QString str;
  34.         in >> time >> str;
  35.         qDebug() << time.toString() << " " << str;
  36.         m_nNextBlockSize = 0;
  37.     }
  38. }
  39.  
  40. void cisco2948::slotError(QAbstractSocket::SocketError)
  41. {
  42.  
  43. }
  44.  
  45. void cisco2948::slotConnect()
  46. {
  47.     m_pTcpSocket->connectToHost("10.255.10.37",23);
  48.     std::cout << "connectToHost\n";
  49. }
  50.  
  51. void cisco2948::slotSendToServer()
  52. {
  53.     QByteArray arrBlock;
  54.     QDataStream out(&arrBlock, QIODevice::WriteOnly);
  55.     out << quint16(0) << "\n";
  56.     out.device()->seek(0);
  57.     out << quint16(arrBlock.size() - sizeof(quint16));
  58.     m_pTcpSocket->write(arrBlock);
  59.     std::cout << "slotSendToServer\n";
  60. }  

  1. #include <QtCore/QCoreApplication>
  2. #include "cisco2948.h"
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6.     QCoreApplication a(argc, argv);
  7.  
  8.     cisco2948 m;
  9.    
  10.     return a.exec();
  11. }  

Результат получается:

  1. connectToHost
  2. cisco 2948
  3. slotSendToServer

А хочется чтобы был:

  1. connectToHost
  2. cisco 2948
  3. slotSendToServer
  4. slotReadyRead
  5.  
  6. User Access Verification
  7. Password:

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

2 replies

July 12, 2012

A.A.M. A.A.M.
Lab Rat
32 posts

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

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

July 13, 2012

_KUL _KUL
Lab Rat
5 posts

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

  1. void cisco2948::slotReadyRead()
  2. {
  3.     buffer.clear();
  4.     buffer.append(m_pTcpSocket->readAll());
  5.     QString str;
  6.     str = buffer.data();
  7.     qDebug() << str;
  8.     if (str.contains("Password: ")) {
  9.  
  10.         std::cout << "true";
  11.         slotSendToServer();
  12.     }
  13. }

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

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

 
  ‹‹ Qt Notes - пятый выпуск      Не отображается ToolBar при отладке в Simulator’e ››

You must log in to post a reply. Not a member yet? Register here!