Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实现TCP应用程序内置shell的简单方法 我想把我自己的shell嵌入到我的C++便携式应用程序中,这将是通过TCP访问的。问题是我真的不知道如何处理控制字符,例如退格、转义。。。我是否应该考虑实施telnet协议?有什么简单的方法可以解决这个问题_C++_C_Shell_Sockets_Tcp - Fatal编程技术网

实现TCP应用程序内置shell的简单方法 我想把我自己的shell嵌入到我的C++便携式应用程序中,这将是通过TCP访问的。问题是我真的不知道如何处理控制字符,例如退格、转义。。。我是否应该考虑实施telnet协议?有什么简单的方法可以解决这个问题

实现TCP应用程序内置shell的简单方法 我想把我自己的shell嵌入到我的C++便携式应用程序中,这将是通过TCP访问的。问题是我真的不知道如何处理控制字符,例如退格、转义。。。我是否应该考虑实施telnet协议?有什么简单的方法可以解决这个问题,c++,c,shell,sockets,tcp,C++,C,Shell,Sockets,Tcp,注: 我知道我避开了“基于意见”的密切原因,但可能存在一种“规范”的方法,广泛用于解决此问题。如果您的目标是实现功能齐全的telnet服务器(即,与Linux提供的类似,它可以运行任意命令行程序,并且可以正确处理用户可能希望运行的任何程序,包括NetHack之类的伪GUI程序),那么您将别无选择,只能实现大部分或全部。telnet协议并不简单,但它比许多协议都简单,因此实现它可能不像您想象的那么困难 另一方面,如果您不需要“完全的telnet兼容性”,而只是想为用户提供一种方式来登录到您的程序,

注:


我知道我避开了“基于意见”的密切原因,但可能存在一种“规范”的方法,广泛用于解决此问题。

如果您的目标是实现功能齐全的telnet服务器(即,与Linux提供的类似,它可以运行任意命令行程序,并且可以正确处理用户可能希望运行的任何程序,包括NetHack之类的伪GUI程序),那么您将别无选择,只能实现大部分或全部。telnet协议并不简单,但它比许多协议都简单,因此实现它可能不像您想象的那么困难

另一方面,如果您不需要“完全的telnet兼容性”,而只是想为用户提供一种方式来登录到您的程序,向其发送文本命令,并读回结果,那就容易多了——只需让您的程序在一个众所周知的端口上接受TCP连接即可(它甚至可以是默认的telnet端口23,尽管这会阻止在该端口上运行标准telnet守护进程)。您的程序只需通过接受的TCP连接发送和接收ASCII字符串即可,这将或多或少适用于任何telnet客户端,因为telnet协议设计为优雅降级,因此即使连接一端的程序不响应telnet的任何特殊命令代码,也将在基本模式下工作

从telnet客户端盲目接收字节的一个小问题是,来自telnet客户端的任何命令代码都可能会混淆您的文本解析器。如果这是您的问题,您可以这样做,将它们从recv()中过滤出来'd数据,在将该数据缓冲区移交给程序的文本解析例程之前:

// Rewrites a C character buffer in-place to remove any telnet command-codes from it
// @param buf Pointer to a buffer of data bytes just recv()'d from the telnet client
// @param bufLen The number of valid bytes that (buf) is pointing to
// @returns the number of valid data bytes that (buf) is pointing to after control codes were removed 
int FilterInputBuffer(char * buf, int bufLen)
{
   // persistent state variables, for the case where a telnet command gets split
   // up across several incoming data buffers
   static bool _inSubnegotiation = false;
   static int _commandBytesLeft = 0;

   // Based on the document at http://support.microsoft.com/kb/231866
   static const unsigned char IAC = 255;
   static const unsigned char SB  = 250;
   static const unsigned char SE  = 240;

   char * output = buf;
   for (int i=0; i<bufLen; i++) 
   {
      unsigned char c = buf[i];
      bool keepChar = ((c & 0x80) == 0);
      switch(c)
      {
         case IAC: _commandBytesLeft = 3;                            break;
         case SB:  _inSubnegotiation = true;                         break;
         case SE:  _inSubnegotiation = false; _commandBytesLeft = 0; break;
      }
      if (_commandBytesLeft > 0) {--_commandBytesLeft; keepChar = false;}
      if (_inSubnegotiation) keepChar = false;
      if (keepChar) *output++ = c;  // strip out any telnet control/escape codes
   }
   return (output-buf);  // return new (possibly shorter) data-buffer length
}
//就地重写C字符缓冲区以从中删除任何telnet命令代码
//@param buf指向刚从telnet客户端接收的数据字节缓冲区的指针
//@param bufLen(buf)指向的有效字节数
//@返回删除控制代码后(buf)指向的有效数据字节数
int FilterInputBuffer(字符*buf,int bufLen)
{
//持久状态变量,用于telnet命令被拆分的情况
//跨多个传入数据缓冲区向上扩展
静态布尔_inSubnegotiation=假;
静态int _commandBytesLeft=0;
//根据http://support.microsoft.com/kb/231866
静态常量无符号字符IAC=255;
静态常量无符号字符SB=250;
静态常量无符号字符SE=240;
字符*输出=buf;
对于(inti=0;i0){--u commandbytesleef;keepChar=false;}
如果(_inSubnegotiation)keepChar=false;
if(keepChar)*output++=c;//去掉所有telnet控制/转义码
}
return(输出buf);//返回新的(可能更短的)数据缓冲区长度
}

Telnet是一个很好的协议,实现基本的Telnet状态机相对容易。但是,为什么不简单地检查输入,如果您发现一个删除或退格键,为什么不简单地跳过下一个字符(用于删除)或退格一个字符(用于退格)?是否存在在屏幕中正确显示某些内容的问题“客户端控制台”或在服务器中处理套接字数据(如果发送了此类字符)?@DeviceFan在服务器中处理套接字数据。当然,我希望使用普通的telnet或其他客户端。