Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2012, 07:55   #1
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию QTcpSocket получить данный от cisco с 22 порта

Здравствуйте!
Есть зоопарк с цисками, у цисок есть порт для управления ими 23, т.е. цепляемся телнетом и управляем . Хочу программкой подключиться как телнетом и считать/записать данные. Ни разу не работал с tcp, подскажите, как правильно считать данные?
Знаю, сейчас отправят читать маны, поэтому скажу, что читал http://qt-project.org/doc/qt-4.8/qt4-network.html , убрал проверку:

PHP код:
cisco2948::cisco2948(QObject *parent) :
    
QObject(parent)
{
    
tcpSocket = new (QTcpSocket);
    
QObject::connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(myRead()));
    
std::cout << "cisco 2948\n";
}

void cisco2948::myRead()
{
    
QDataStream in(tcpSocket);

         
QString bym;
         
in >> bym;

         
qDebug() << bym;

}

void cisco2948::myConnect()
{
    
tcpSocket->connectToHost("10.255.xx.37",23);
    
std::cout << "Connect ...\n";

В ответ получил:
PHP код:
cisco 2948
Connect 
...
""
"" 
А хочется:
PHP код:
User Access Verification

Password

Подскажите простой доступ, как по типу телнета подключиться, прочитать, отдать, снова прочитать?
_KUL вне форума Ответить с цитированием
Старый 12.07.2012, 09:04   #2
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

Привёл к человеческому виду:
PHP код:
#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 
PHP код:
#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(&arrBlockQIODevice::WriteOnly);
    
out << quint16(0) << "\n";
    
out.device()->seek(0);
    
out << quint16(arrBlock.size() - sizeof(quint16));
    
m_pTcpSocket->write(arrBlock);
    
std::cout << "slotSendToServer\n";

Делаю:
PHP код:
#include <QtCore/QCoreApplication>
#include "cisco2948.h"

int main(int argcchar *argv[])
{
    
QCoreApplication a(argcargv);

    
cisco2948 m;
    
    return 
a.exec();

А в ответ пустота
PHP код:
connectToHost
cisco 2948
slotSendToServer 
_KUL вне форума Ответить с цитированием
Старый 12.07.2012, 09:12   #3
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

PHP код:
void cisco2948::slotReadyRead()
{
    
QDataStream in(m_pTcpSocket);
    for (;;) {
        if (!
m_nNextBlockSize) {
            if (
m_pTcpSocket->bytesAvailable() < sizeof(quint16)) {
                
std::cout << "bym1\n";
                break;
            }
            
std::cout << "bym2\n";
            
in >> m_nNextBlockSize;
        }

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

PHP код:
connectToHost
cisco 2948
slotSendToServer
bym3
bym3
bym3
bym3
bym3
bym3 
Это ему не нравится, что в потоке пришло ещё не полное количество байт?!
_KUL вне форума Ответить с цитированием
Старый 12.07.2012, 10:17   #4
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

мне сейчас скажут, что телнет работает на прикладном уровне и отправят читать RFC 854 по телнету?!
_KUL вне форума Ответить с цитированием
Старый 12.07.2012, 15:41   #5
AlexMas
Пользователь
 
Аватар для AlexMas
 
Регистрация: 30.05.2012
Сообщений: 69
По умолчанию

уверен, что в начале ответа сервера идет размер, пересылаемого, блока?
я нет =)
AlexMas вне форума Ответить с цитированием
Старый 13.07.2012, 10:35   #6
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

Хм, а ведь верно!

в паблик класса кидаюЖ
PHP код:
QByteArray buffer
а читаю так:
PHP код:
void cisco2948::slotReadyRead()
{
    
buffer.clear();
    
buffer.append(m_pTcpSocket->readAll());
    
std::cout << buffer.data();

Результат:
PHP код:
connectToHost
cisco 2948
*&#8730;☺*√♥*¤↑*¤▼*√☺*√♥*¤↑*¤▼

User Access Verification

Password

интересно, что это за мусор приходит вначале ...
_KUL вне форума Ответить с цитированием
Старый 13.07.2012, 11:19   #7
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

Искать подстроку в выводе можно так:
PHP код:
buffer.clear();
    
buffer.append(m_pTcpSocket->readAll());
    
QString str;
    
str buffer.data();
    
qDebug() << str;
    if (
str.contains("Password: ")) {
        
делаем жуткие вещи
    

Писать можно так:
PHP код:
QByteArray ba;
    
QString qs"парольотциски\n";
    
qs.toLocal8Bit();
    
ba+=qs;
    
qDebug()<<ba;
    
m_pTcpSocket->write(ba); 
И можно делать с железяками что угодно! Круто
_KUL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить данные с СОМ-порта Lampard7 Win Api 0 19.10.2011 19:48
Получить данный из функции веб-сервиса Lazio Общие вопросы .NET 1 16.11.2010 23:18
Cisco L.S.F. Свободное общение 3 27.02.2010 15:10
Как получить данные с COM-порта или другого любого порта? DeLure Общие вопросы C/C++ 5 20.09.2007 00:50