Russian Qt Forum

Qt => Работа с сетью => Тема начата: beginner от Январь 05, 2014, 17:01



Название: Подключение к Telnet серверу
Отправлено: beginner от Январь 05, 2014, 17:01
Пытаюсь написать клиента для работы с телнет сервером, не получается получить от сервера строку "login"
Код:
// ----------------------------------------------------------------------
void MyClient::slotReadyRead()
{
    m_ptxtInfo->append("Received the ReadyRead() signal");
    buffer.clear();
    buffer.append(m_pTcpSocket->readAll());
    QString str;
    str = buffer.data();
    m_ptxtInfo->append(str);
    qDebug() << "slotReadyRead";
}

// -------------------------------------------------------
получаю непонятный мне набор символов 
   Локальные переменные      
      str   "��%��\001��\003��'��\037��"   QString
      this   @0x28fe08   MyClient
   


Название: Re: Подключение к Telnet серверу
Отправлено: Bepec от Январь 05, 2014, 17:42
Очень просто - у вас проблема с кодировкой.  Вам в ответ приходит UTF8, а вы пытаетесь видимо запихать его сразу в юникод.

Используйте QTextCodec. Документация в ассистенте есть.



Название: Re: Подключение к Telnet серверу
Отправлено: beginner от Январь 05, 2014, 18:33
вот так пробую
Код:
void MyClient::slotReadyRead()
{
    m_ptxtInfo->append("Received the ReadyRead() signal");
    buffer.clear();
    buffer.append(m_pTcpSocket->readAll());
    QString str;
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    str = codec->toUnicode(buffer.data());
   // str = buffer.data();
    m_ptxtInfo->append(str);
    qDebug() << "slotReadyRead";
}
получаю
"��%��\001��\003��'��\037��"
Код:
QTextCodec *codec = QTextCodec::codecForName("CP1251");
    QTextCodec::setCodecForLocale(codec);
    str = codec->toUnicode(buffer.data());

"яэ%яы\001яы\003яэ'яэ\037яэ"


Название: Re: Подключение к Telnet серверу
Отправлено: Bepec от Январь 05, 2014, 19:21
Не buffer.data, а buffer.

PS ...


Название: Re: Подключение к Telnet серверу
Отправлено: beginner от Январь 05, 2014, 19:34
Код:
 QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec);
    str = codec->toUnicode(buffer);
"��%��\001��\003��'��\037��\000��\000"

Должна быть вот такая строка

Welcome to Microsoft Telnet Service

login:


Название: Re: Подключение к Telnet серверу
Отправлено: gil9red от Январь 05, 2014, 20:42
Может попробовать добавить QTextCodec::setCodecForСStrings(codec); ?


Название: Re: Подключение к Telnet серверу
Отправлено: beginner от Январь 05, 2014, 21:14
Может попробовать добавить QTextCodec::setCodecForСStrings(codec); ?
Qt 5.2  QTextCodec::setCodecForСStrings - нет такого метода?


Название: Re: Подключение к Telnet серверу
Отправлено: LisandreL от Январь 06, 2014, 18:21
Код:
 QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec);
    str = codec->toUnicode(buffer);
"��%��\001��\003��'��\037��\000��\000"

Должна быть вот такая строка

Welcome to Microsoft Telnet Service

login:
Сильно сомневаюсь, что в Microsoft Telnet Service кодировка utf-8, скорее всего cp866 или cp1251.
Код:
 QTextCodec *codec = QTextCodec::codecForName("cp866");
    str = codec->toUnicode(buffer);


Название: Re: Подключение к Telnet серверу
Отправлено: Bepec от Январь 06, 2014, 19:01
�\001�� Это ж прямой utf. сначала комбинация, потом код символа. Хотя действительно интересно в чём он :)

PS сохраните массив с помощью QSettings и выкиньте сюда :D Я поковыряю тогда.


Название: Re: Подключение к Telnet серверу
Отправлено: beginner от Январь 06, 2014, 19:13


Код:
 QTextCodec *codec = QTextCodec::codecForName("cp866");
    str = codec->toUnicode(buffer);

" ¤% √\001 √\003 ¤' ¤\037 ¤\000 √\000"


Название: Re: Подключение к Telnet серверу
Отправлено: beginner от Январь 07, 2014, 09:30
�\001�� Это ж прямой utf. сначала комбинация, потом код символа. Хотя действительно интересно в чём он :)

PS сохраните массив с помощью QSettings и выкиньте сюда :D Я поковыряю тогда.
А не могли бы посмотреть в каком виде у вас телнет выдает?


Название: Re: Подключение к Telnet серверу
Отправлено: Mikhail от Январь 07, 2014, 11:15
Насколько я помню телнет протокол там идет обмен строками.
Попробуй с заменой в твоем первом посте:

    QString str;

    str = m_pTcpSocket->readLine();
    m_ptxtInfo->append(str);


Название: Re: Подключение к Telnet серверу
Отправлено: xokc от Январь 07, 2014, 11:24
Что-то вы тут теплое с мягким путаете. Ни одна из приведенных тут строк не имеет никакого отношения ни к UTF-8, ни к UNICODE в частности. Строка "Welcome to Microsoft Telnet Service" во всех однобайтных кодировках (и в UTF-8, кстати, тоже) будет выглядеть именно как "Welcome to Microsoft Telnet Service".
Я бы вообще для начала посмотрел на содержимое QByteArray buffer = m_pTcpSocket->readAll(). Сразу всё ясно станет и, сдается мне, кодировки тут не причем.


Название: Re: Подключение к Telnet серверу
Отправлено: beginner от Январь 07, 2014, 11:53
В таком виде подойдет?


Название: Re: Подключение к Telnet серверу
Отправлено: beginner от Январь 07, 2014, 11:58
Насколько я помню телнет протокол там идет обмен строками.
Попробуй с заменой в твоем первом посте:

    QString str;

    str = m_pTcpSocket->readLine();
    m_ptxtInfo->append(str);
Пробовал, те же каракули.


Название: Re: Подключение к Telnet серверу
Отправлено: Serr500 от Январь 07, 2014, 12:41
Похоже, ошибка где-то в другом месте. Попробуйте подцепиться к smtp.yandex.ru:25 и посмотрите на ответ. Вот простейший пример, в котором всё работает как надо (Qt5.2.0).


Название: Re: Подключение к Telnet серверу
Отправлено: Serr500 от Январь 07, 2014, 12:47
А вот и ответ Microsoft Telnet Server. По русски он может общаться.  :D


Название: Re: Подключение к Telnet серверу
Отправлено: beginner от Январь 07, 2014, 13:15
Не подключается, пинг проходит


Название: Re: Подключение к Telnet серверу
Отправлено: Serr500 от Январь 07, 2014, 13:18
Хм... Вероятно, у провайдера 25-й порт закрыт. Тогда smtp.yandex.ru:587.

P.S. А я так и не понял, что там за кодировка...


Название: Re: Подключение к Telnet серверу
Отправлено: beginner от Январь 07, 2014, 13:23
Подключился и все нормально.
А вы с телнетом можете показать, плиз


Название: Re: Подключение к Telnet серверу
Отправлено: beginner от Январь 07, 2014, 13:29

А вы с телнетом можете показать, плиз
Или та же история как и у меня?


Название: Re: Подключение к Telnet серверу
Отправлено: beginner от Январь 07, 2014, 13:34
Мне по телнету надо проверять состояние потоков на системе передач, пробовал туда коннектится, получаю строку в таком же виде как и от своего сервера телнет, и что с этим делать ???


Название: Re: Подключение к Telnet серверу
Отправлено: Serr500 от Январь 07, 2014, 13:39
Фу, блин!.. Разобрался. Wireshark forever! У M$ telnet-протокол какой-то нестандартный. Там нет передачи простых текстовых строк, он сразу пытается передать специальные данные, которые вообще не строки. Вероятно, telnet-клиент эту чертовщину понимает, а Вам её придётся расшифровывать.


Название: Re: Подключение к Telnet серверу
Отправлено: Serr500 от Январь 07, 2014, 13:46
А вот я и неправ! Протокол-то стандартный. Это я его попутал с SMTP, который полностью текстовый. Wiki утверждает, что он изначально не текстовый http://ru.wikipedia.org/wiki/Telnet (http://ru.wikipedia.org/wiki/Telnet).


Название: Re: Подключение к Telnet серверу
Отправлено: beginner от Январь 07, 2014, 13:47
Есть уже готовый класс для работы с телнет QtTelnet, только вот он у меня при компиляции  ошибки выдает, я так понимаю из-за старой версии QT, может есть у кого рабочий вариант под QT5.2
 Вот тут http://qt-project.org/forums/viewthread/18711 (http://qt-project.org/forums/viewthread/18711)коллега заходит тоже по телнету, без дополнительных преобразований, почему у меня не выходит
Код:
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;
    }
}
 


Название: Re: Подключение к Telnet серверу
Отправлено: Serr500 от Январь 07, 2014, 17:07
почему у меня не выходит
Видимо, у цисок другой вариант протокола...