최종완료보고 버전
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
|
||||
#include "huslib.h"
|
||||
#include "huslibex.h"
|
||||
#include "MultiplexSocket.h"
|
||||
#include "MultiplexTransport.h"
|
||||
|
||||
|
||||
HTelnetHandler::HTelnetHandler()
|
||||
{
|
||||
m_nCommandBufferedLength = 0;
|
||||
m_bInitialStep = 0;
|
||||
}
|
||||
|
||||
HTelnetHandler::~HTelnetHandler()
|
||||
{
|
||||
}
|
||||
|
||||
void HTelnetHandler::OnReceivedStatusFromTransport(int nStatus)
|
||||
{
|
||||
if (nStatus == HTransport::T_BEGIN_TRANSPORT)
|
||||
{
|
||||
char bufSend[4];
|
||||
bufSend[0] = (char)IAC;
|
||||
bufSend[1] = (char)WILL;
|
||||
bufSend[2] = (char)SGAHEAD;
|
||||
|
||||
SendToTransport(bufSend, 3);
|
||||
}
|
||||
}
|
||||
|
||||
int HTelnetHandler::OnReceivedFromTransport(const char * pData, int nSize)
|
||||
{
|
||||
if (m_bInitialStep == 0 && pData[0] == (char)IAC && pData[1] == (char)DO &&
|
||||
pData[2] == (char)SGAHEAD)
|
||||
{
|
||||
if (m_bInitialStep != 0)
|
||||
return -1; // close connection
|
||||
|
||||
m_bInitialStep = 1;
|
||||
|
||||
char bufSend[4];
|
||||
bufSend[0] = (char)IAC;
|
||||
bufSend[1] = (char)WILL;
|
||||
bufSend[2] = (char)ECHO;
|
||||
|
||||
SendToTransport(bufSend, 3);
|
||||
return 0;
|
||||
}
|
||||
else if (m_bInitialStep == 1 && pData[0] == (char)IAC && pData[1] == (char)DO &&
|
||||
pData[2] == (char)ECHO)
|
||||
{
|
||||
if (m_bInitialStep != 1)
|
||||
return -1; // close connection
|
||||
|
||||
m_bInitialStep = 2;
|
||||
|
||||
OnEstablished();
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (pData[0] == '\t' || ((nSize >= 3 && pData[0] == 0x1b && pData[1] == 0x5b) &&
|
||||
(pData[2] == 0x41 || // up
|
||||
pData[2] == 0x42 || // down
|
||||
pData[2] == 0x43 || // right
|
||||
pData[2] == 0x44))) // left
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else if (pData[0] == '\b')
|
||||
{
|
||||
if (m_nCommandBufferedLength > 0)
|
||||
m_nCommandBufferedLength--;
|
||||
|
||||
SendToTransport("\b \b", 3);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (m_bInitialStep == 2 && OnInitialReceive(pData, nSize))
|
||||
m_bInitialStep = 3;
|
||||
|
||||
if (m_bInitialStep == 3)
|
||||
SendToTransport(pData, nSize);
|
||||
|
||||
memcpy(m_pCommandBuffer + m_nCommandBufferedLength, pData, nSize);
|
||||
m_nCommandBufferedLength += nSize;
|
||||
|
||||
HString strTemp(pData, nSize);
|
||||
if (strTemp.Find('\n') > 0)
|
||||
{
|
||||
for (int i = m_nCommandBufferedLength - 1; i >= 0; i--)
|
||||
{
|
||||
if (m_pCommandBuffer[i] == '\r' || m_pCommandBuffer[i] == '\n')
|
||||
m_pCommandBuffer[i] = '\0';
|
||||
}
|
||||
|
||||
int nResult = OnReceivedCommand(m_pCommandBuffer);
|
||||
m_nCommandBufferedLength = 0;
|
||||
|
||||
if (nResult >= 0)
|
||||
SendToTransport("> ", 2);
|
||||
|
||||
return nResult;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user