最近学习ssh协议,为了方便,自己先实现一套telnet服务,以便之后套用ssh(自己进了一个深坑)。
客户端:
先从telnet客户端做起。这里先给出RFC的中文文档链接:http://oss.org.cn/man/develop/rfc/RFC854.txt 。基本上把telnet介绍得差不多了。但关于NVT的介绍太少,也没有给出一个标准。就比如说键盘的方向键ASCII映射NVT不知道是什么。网上查了很久的资料都没有找到。最终通过自己抓包权威的telnet软件才知道方向键与其他一些按键的NVT ASCII值。现在找到了一些关于NVTASCII的说明文档:http://oss.org.cn/man/develop/rfc/RFC698.txt 就上键来说,getch()收到的值是十进制:224 72 ,转换为ASCII是十进制 27 91 65 (/033[A),下是27 91 66 (/033[B)。因为没找到其他的标准,我就只处理了方向以及退格键的一些必要NVTASCII。
拿了两个权威的telnet服务器来测试,一个是我的centos服务器的telnet,一个是我的win服务器自带的的telnet。
键盘的获取使用conio.h下的getch函数,使用这个函数要注意不要阻塞IO,最好是使用_kbhit函数来检测键盘是否有输入再getch,否则可能会出现getch阻塞时,另外线程的IO也会等待getch的结束而阻塞。另外需要注意Ctrl+C、Ctrl+Z之类会直接影响到程序执行过程的输入,需要额外处理。
客户端连接centos服务器:
doc.h 头文件:
#ifndef DOC_H_INCLUDED
#define DOC_H_INCLUDED
#define BS (char)8
#define LF (char)10
#define CR (char)13
#define ESC (char)27
#define SPACE (char)32
#define MFLAG (char)91
#define MARK (char)224
#define SE (char)240
#define NOP (char)241
#define DM (char)242
#define BRK (char)243
#define IP (char)244
#define AO (char)245
#define AYT (char)246
#define EC (char)247
#define EL (char)248
#define GA (char)249
#define SB (char)250
#define WILL (char)251
#define WONT (char)252
#define DO (char)253
#define DON'T (char)254
#define IAC (char)255
#endif // DOC_H_INCLUDED
telnet客户端代码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <conio.h>
#include <windows.h>
#include <winsock2.h>
#include "doc.h"
//简单的方向键与NVT映射
int mhash[1000];
void init()
{
mhash[72]='A';
mhash[80]='B';
mhash[77]='C';
mhash[7