4const char QTelnet::IACWILL[2] = { IAC, WILL };
 
    5const char QTelnet::IACWONT[2] = { IAC, WONT };
 
    6const char QTelnet::IACDO[2]   = { IAC, DO };
 
    7const char QTelnet::IACDONT[2] = { IAC, DONT };
 
    8const char QTelnet::IACSB[2]   = { IAC, SB };
 
    9const char QTelnet::IACSE[2]   = { IAC, SE };
 
   11char QTelnet::_sendCodeArray[2]   = { IAC, 0 };
 
   12char QTelnet::_arrCRLF[2]         = { 13, 10 };
 
   13char QTelnet::_arrCR[2]           = { 13, 0 };
 
   15QTelnet::QTelnet(SocketType type, QObject *parent) :
 
   16    QObject(parent),  m_socketType(type), m_actualSB(0)
 
   18    connect(&m_tcpSocket, &QTcpSocket::errorOccurred, 
this, &QTelnet::socketError);
 
   19    connect(&m_tcpSocket, &QTcpSocket::readyRead, 
this, &QTelnet::onTcpReadyRead);
 
   20    connect(&m_tcpSocket, &QTcpSocket::stateChanged, 
this, &QTelnet::onStateChanged);
 
   21#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) 
   22    connect(&m_webSocket, &QWebSocket::errorOccurred, 
this, &QTelnet::socketError);
 
   24    connect(&m_webSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error), 
this, &QTelnet::socketError);
 
   26    connect(&m_webSocket, &QWebSocket::binaryMessageReceived, 
this, &QTelnet::binaryMessageReceived);
 
   27    connect(&m_webSocket, &QWebSocket::stateChanged, 
this, &QTelnet::onStateChanged);
 
   30void QTelnet::setType(SocketType type)
 
   32    if(type != TCP && type != WEBSOCKET && type != SECUREWEBSOCKET)
 
   38QString QTelnet::peerInfo()
 const 
   40    if(m_socketType == TCP)
 
   41        return m_tcpSocket.peerName()+
" ("+m_tcpSocket.peerAddress().toString()+
" ):"+m_tcpSocket.peerPort();
 
   42    else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
 
   43        return m_webSocket.peerName()+
" ("+m_webSocket.peerAddress().toString()+
" ):"+QString::number(m_webSocket.peerPort());
 
   48QString QTelnet::peerName()
 const 
   50    if(m_socketType == TCP)
 
   51        return m_tcpSocket.peerName();
 
   52    else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
 
   53        return m_webSocket.peerName();
 
   58bool QTelnet::isConnected()
 const 
   60    if(m_socketType == TCP)
 
   61        return m_tcpSocket.state() == QAbstractSocket::ConnectedState;
 
   62    else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
 
   63        return m_webSocket.state() == QAbstractSocket::ConnectedState;
 
   68void QTelnet::connectToHost(
const QString &host, quint16 port)
 
   72        if(m_socketType == TCP) {
 
   74            m_tcpSocket.connectToHost(host, port, QAbstractSocket::ReadWrite, QAbstractSocket::AnyIPProtocol);
 
   75        } 
else if(m_socketType == WEBSOCKET) {
 
   77            m_webSocket.open(QUrl(
"ws://"+host+
":"+QString::number(port)));
 
   78        } 
else if(m_socketType == SECUREWEBSOCKET) {
 
   80            m_webSocket.open(QUrl(
"wss://"+host+
":"+QString::number(port)));
 
   85void QTelnet::disconnectFromHost(
void)
 
   87    if(m_socketType == TCP)
 
   88        m_tcpSocket.disconnectFromHost();
 
   89    else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
 
   93void QTelnet::write(
const char c)
 
   97    if(m_socketType == TCP)
 
   98        m_tcpSocket.write( (
char*)&c, 1 );
 
   99    else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
 
  100        m_webSocket.sendBinaryMessage(QByteArray(&c, 1));
 
  103qint64 QTelnet::write(
const char *data, qint64 len)
 
  107    if(m_socketType == TCP) {
 
  108        return m_tcpSocket.write( data, len );
 
  109    } 
else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET) {
 
  110        return m_webSocket.sendBinaryMessage(QByteArray(data, len));
 
  115qint64 QTelnet::read(
char *data, qint64 maxlen)
 
  119    if(m_socketType == TCP)
 
  120        return m_tcpSocket.read(data, maxlen);
 
  121    else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET) {
 
  127bool QTelnet::testBinaryMode()
 const 
  129    return m_receivedDX[(
unsigned char)TELOPT_BINARY] == DO;
 
  132void QTelnet::sendData(
const QByteArray &ba)
 
  135        transpose( ba.constData(), ba.length() );
 
  138void QTelnet::sendData(
const char *data, 
int len)
 
  141        transpose( data, len );
 
  144void QTelnet::socketError(QAbstractSocket::SocketError err)
 
  146    disconnectFromHost();
 
  150QString QTelnet::errorString()
 
  152    if(m_socketType == TCP)
 
  153        return m_tcpSocket.errorString();
 
  154    else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
 
  155        return m_webSocket.errorString();
 
  160void QTelnet::setCustomCR(
char cr, 
char cr2)
 
  166void QTelnet::setCustomCRLF(
char lf, 
char cr)
 
  173void QTelnet::sendTelnetControl(
char codigo)
 
  175    _sendCodeArray[1] = codigo;
 
  176    write(_sendCodeArray, 2);
 
  179void QTelnet::writeCustomCRLF()
 
  184void QTelnet::writeCustomCR()
 
  192    for( 
int i = 0; i < 256; i++ )
 
  198        m_negotiationState = STATE_DATA;
 
  202    m_oldWinSize.setHeight(-1);
 
  203    m_oldWinSize.setWidth(-1);
 
 
  206void QTelnet::sendSB(
char code, 
char *arr, 
int iLen)
 
  217void QTelnet::sendWindowSize()
 
  219    if( isConnected() && (m_receivedDX[TELOPT_NAWS] == DO) && (m_oldWinSize != m_winSize) )
 
  223        m_oldWinSize = m_winSize;
 
  224        size[0] = (m_winSize.width()>>8) & 0xFF;
 
  225        size[1] = m_winSize.width() & 0xFF;
 
  226        size[2] = (m_winSize.height()>>8) & 0xFF;
 
  227        size[3] = m_winSize.height() & 0xFF;
 
  228        sendSB(TELOPT_NAWS, size, 4);
 
  233void QTelnet::handleSB()
 
  238        if( (m_buffSB.length() > 0) &&
 
  239            ((
unsigned char)m_buffSB[0] == (
unsigned char)TELQUAL_SEND) )
 
  247            write(
"SiraggaTerminal", 15);
 
  256void QTelnet::transpose(
const char *buf, 
int iLen)
 
  258    for( 
int i = 0; i < iLen; i++ )
 
  274            if( testBinaryMode() || m_socketType == WEBSOCKET  || m_socketType == SECUREWEBSOCKET)
 
  283            if( testBinaryMode() || m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
 
  296void QTelnet::willsReply(
char action, 
char reply)
 
  298    if( (reply != m_sentDX[(
unsigned char)action]) ||
 
  299        (WILL != m_receivedWX[(
unsigned char)action]) )
 
  305        m_sentDX[(
unsigned char)action] = reply;
 
  306        m_receivedWX[(
unsigned char)action] = WILL;
 
  310void QTelnet::wontsReply(
char action, 
char reply)
 
  312    if( (reply != m_sentDX[(
unsigned char)action]) ||
 
  313        (WONT != m_receivedWX[(
unsigned char)action]) )
 
  319        m_sentDX[(
unsigned char)action] = reply;
 
  320        m_receivedWX[(
unsigned char)action] = WONT;
 
  324void QTelnet::doesReply(
char action, 
char reply)
 
  326    if( (reply != m_sentWX[(
unsigned char)action]) ||
 
  327        (DO != m_receivedDX[(
unsigned char)action]) )
 
  333        m_sentWX[(
unsigned char)action] = reply;
 
  334        m_receivedDX[(
unsigned char)action] = DO;
 
  338void QTelnet::dontsReply(
char action, 
char reply)
 
  340    if( (reply != m_sentWX[(
unsigned char)action]) ||
 
  341        (DONT != m_receivedDX[(
unsigned char)action]) )
 
  347        m_sentWX[(
unsigned char)action] = reply;
 
  348        m_receivedDX[(
unsigned char)action] = DONT;
 
  353qint64 QTelnet::doTelnetInProtocol(qint64 buffSize)
 
  357    for( iIn = 0, iOut = 0; iIn < buffSize; iIn++ )
 
  359        char b = m_buffIncoming[iIn];
 
  361        switch( m_negotiationState )
 
  368                m_negotiationState = STATE_IAC;
 
  371                m_buffProcessed[iOut++] = 
'\r';
 
  372                m_negotiationState = STATE_DATAR;
 
  375                m_buffProcessed[iOut++] = 
'\n';
 
  376                m_negotiationState = STATE_DATAN;
 
  379                m_buffProcessed[iOut++] = b;
 
  388                m_negotiationState = STATE_IAC;
 
  391                m_buffProcessed[iOut++] = 
'\r';
 
  392                m_negotiationState = STATE_DATA;
 
  395                m_buffProcessed[iOut++] = 
'\n';
 
  396                m_negotiationState = STATE_DATA;
 
  399                m_buffProcessed[iOut++] = b;
 
  400                m_negotiationState = STATE_DATA;
 
  408                m_negotiationState = STATE_DATA;
 
  409                m_buffProcessed[iOut++] = IAC;
 
  412                m_negotiationState = STATE_IACWILL;
 
  415                m_negotiationState = STATE_IACWONT;
 
  418                m_negotiationState = STATE_IACDONT;
 
  421                m_negotiationState = STATE_IACDO;
 
  425                m_negotiationState = STATE_DATA;
 
  428                m_negotiationState = STATE_IACSB;
 
  432                m_negotiationState = STATE_DATA;
 
  440                emitEchoLocal(
false);
 
  456            m_negotiationState = STATE_DATA;
 
  478            m_negotiationState = STATE_DATA;
 
  497                m_receivedDX[(
unsigned char)b] = (
unsigned char)DO;
 
  498                m_sentWX[(
unsigned char)b] = (
unsigned char)WILL;
 
  510            m_negotiationState = STATE_DATA;
 
  517                emitEchoLocal(
false);
 
  532            m_negotiationState = STATE_DATA;
 
  539                m_negotiationState = STATE_IACSBIAC;
 
  545                m_negotiationState = STATE_IACSBDATA;
 
  549        case STATE_IACSBDATA:   
 
  553                m_negotiationState = STATE_IACSBDATAIAC;
 
  567                m_negotiationState = STATE_IACSBDATA;
 
  571                m_negotiationState = STATE_DATA;
 
  575        case STATE_IACSBDATAIAC:
 
  579                m_negotiationState = STATE_IACSBDATA;
 
  580                m_buffSB.append(IAC);
 
  586                m_negotiationState = STATE_DATA;
 
  591                m_negotiationState = STATE_IACSB;
 
  596                m_negotiationState = STATE_DATA;
 
  601            m_negotiationState = STATE_DATA;
 
  608void QTelnet::onTcpReadyRead()
 
  613    while( (readed = read(m_buffIncoming, IncommingBufferSize)) != 0 )
 
  618            disconnectFromHost();
 
  621            processed = doTelnetInProtocol(readed);
 
  623                emit newData(m_buffProcessed, processed);
 
  630void QTelnet::binaryMessageReceived(
const QByteArray &message)
 
  632    emit newData(message.constData(), message.length());
 
  635void QTelnet::onStateChanged(QAbstractSocket::SocketState s) 
 
  637    emit stateChanged(s);
 
void resetProtocol()
Resetea los datos del protocolo. Debe llamarse cada vez que se inicia una conexión nueva.