tag 标签: telnet

相关博文
  • 热度 26
    2013-6-19 16:47
    1677 次阅读|
    0 个评论
    “我用一个以太网插板负载到Arduino上。如此我便实现了打开我的车库门……就是这样! 我也安装了一个磁传感器,门是开着的或者封闭的都可以让我知道。所有都通过Telnet实现。 我修改了来自聊天服务器代码。现在贴出代码给爱好者使用。“   图一  安装在车库里的Arduino装置 图二 正在打开车库门 图三 用手机远程控制车库门开关 代码: #include SPI.h #include Ethernet.h String readString; // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network. // gateway and subnet are optional: byte mac[] = {   0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,1, 177); IPAddress gateway(192,168,1, 1); IPAddress subnet(255, 255, 0, 0); // telnet defaults to port 23 EthernetServer server(23); boolean alreadyConnected = false; // whether or not the client was connected previously const int analogInPin = A4; int relay = 3; int sensorValue = 0; void setup() {     pinMode(2, INPUT_PULLUP);   pinMode(relay, OUTPUT);     digitalWrite(relay, HIGH);   // initialize the ethernet device   Ethernet.begin(mac, ip, gateway, subnet);   // start listening for clients   server.begin();  // Open serial communications and wait for port to open:   Serial.begin(9600);    while (!Serial) {     ; // wait for serial port to connect. Needed for Leonardo only   }   Serial.print(“Chat server address:”);   Serial.println(Ethernet.localIP()); } void loop() {     // wait for a new client:   EthernetClient client = server.available();   // when the client sends the first byte, say hello:     if (client) {     if (!alreadyConnected) {       // clead out the input buffer:       client.flush();          Serial.println(“We have a new client”);       client.println(“Hello, client!”);       alreadyConnected = true;             }   while (client.available()) {            if (client.available() 0) {                  // read the bytes incoming from the client:            char thisChar = client.read();        readString += thisChar;       // echo the bytes back to the client:       //server.write(thisChar);  //     server.write(thisChar);       // echo the bytes to the server as well:      Serial.write(thisChar);       }   }   //check here for stuff     //Code to open if (readString.toInt() == 1111) {   server.println(“Running Opener”); if (checkOpen() == 0) { server.println(“Closing”); }else { server.println (“Opening”);}   digitalWrite(relay, LOW);   delay(1000);     digitalWrite(relay, HIGH);   }     //code to check if open/closed   if (readString.toInt() == 5555) {if (checkOpen() == 0) {       server.println(“Garage is OPEN”);     } else { server.println(“Garage is CLOSED”); }}     readString = “”; //end check   } } //checkopen int checkOpen() {sensorValue = digitalRead(2); if (sensorValue == 0) {return 1; }else {return 0;}} // 0 = OPEN so we close. //1 = CLOSE so we open.   更多信息与我们交流: WIZnet邮箱: wiznetbj@wiznettechnology.com WIZnet中文主页: http://www.iwiznet.cn WIZnet中文博客: http://blog.iwiznet.cn WIZnet企业微博: http://e.weibo.com/wiznet2012
  • 热度 21
    2012-7-10 09:55
    1446 次阅读|
    0 个评论
      在上两篇博文( 如何使用W7100A实现Telnet服务器(一) 、 如何使用W7100A实现Telnet服务器(二) )里我们简单地介绍一下Telnet,第三章将会演示Telnet函数的具体功能,第四章将涉及到代码的分析。这篇文档中所有的示例代码都是基于Keil uVision3。 第一篇在这里: http://forum.eet-cn.com/BLOG_ARTICLE_12989.HTM 第二篇在这里: http://forum.eet-cn.com/BLOG_ARTICLE_13008.HTM 下面我们介绍第三部分(主要内容是第四章的余下的代码分析部分):     4.3 tel_input()函数 tel_input()函数用来处理Telnet终端机内的输入命令。具体每一个命令以及处理方法请参考表3.1。 void tel_input(SOCKET s) { uint8 xdata c; while(1){ if((getSn_RX_RSR(s)) == 0)  break;     /*如果没有接收到的数据,断开*/ if(recv(s, c, 1) == 0) break;     /*如果接收到的数据为0,断开*/ if(user_state == LOGOUT)  break;     /*如果用户的声明是LOGOUT, 断开*/ if(c != IAC){         /*如果接收到的数据不是控制字符*/ data_buf = c;    /*保存接收到的数据到data_buf*/ putchar(c); if(user_state == LOGOUT)  break; if(user_state != PASSWORD){        sprintf(buf, "%c", c);        send(s, buf, strlen(buf)); } if(c == '\n'){     /*如果接收到一个\n’ ASCII 代码*/        if(buf_index 1){          if(data_buf == '\r')  data_buf = '\0';          else  data_buf = '\0';          proc_command(s);      /* 处理接收到的数据*/          if(user_state == LOGIN) {            sprintf(buf, "W7100");            send(s, buf, strlen(buf));          }        }        else{          sprintf(buf, "W7100");          send(s, buf, strlen(buf));        }        buf_index = 0; } continue; } if(recv(s, c, 1) == 0)  break; switch(c){            /*如果接收到一个IAC字符*/ case WILL: if(recv(s, c, 1) == 0)  break; willopt(s, c);      /*调用willopt()处理WILL命令*/ break; case WONT: if(recv(s, c, 1) == 0)  break; wontopt(s, c);      /*调用wontopt()来处理WONT命令*/ break; case DO: if(recv(s, c, 1) == 0)  break; doopt(s, c);      /*调用doopt()处理DO命令*/ break; case DONT: if(recv(s, c, 1) == 0)  break; dontopt(c);      /*调用dontopt()处理DON’T命令*/ break; case IAC: break; } break; } return; } 程序4.3parseMSG()函数   4.4 proc_command()函数 proc_command()函数处理在tel_input()函数中输入的命令。它定义了HELP、GET LED、LED0 ON/OFF和LED2 ON/OFF命令。对于未定义的命令它显示“BAD COMMAND”。 void proc_command(SOCKET s) { uint8 i; char **cmdp, *cp; char *help = {"HELP: Show all available commands\r\n\GET LED: Show all LED status\                  \r\nLED0 ON/OFF: Turn ON/OFF the LED0\r\nLED1 ON/OFF: Turn ON/OFF the LED1\          \r\nLED2 ON/OFF: Turn ON/OFF the LED2\r\nEXIT: Exit from W7100 Telnet server\r\n"};        /*Translate the first word to lower case*/ for(cp = data_buf; *cp !='\0'; cp++){ *cp = tolower(*cp);     /* 将大写字母翻译成小写字母*/ } if(user_state == USERNAME){ strcpy(user_name, data_buf); sprintf(buf, "Please insert your PW: "); send(s, buf, strlen(buf)); user_state = PASSWORD; return; } else if(user_state == PASSWORD){ strcpy(user_password, data_buf); sprintf(buf, "\r\nSuccessfully connected!!\r\nImplemented Command: \ HELP, GET LED, LED0 ON/OFF, LED1 ON/OFF, LED2 ON/OFF, EXIT\r\n"); send(s, buf, strlen(buf)); user_state = LOGIN; return; }     /*查找表中的输入命令; 如果不表内,返回语法错误*/ for(cmdp = commands; *cmdp != NULL; cmdp++){  if(strncmp(*cmdp, data_buf, strlen(*cmdp)) == 0)     break; } if(*cmdp == NULL){ printf("NULL command\r\n"); sprintf(buf, "BAD command\r\n"); send(s, buf, strlen(buf)); return; } switch(cmdp - commands){ case HELP_CMD:         /* 处理HELP命令*/ printf("HELP_CMD\r\n"); sprintf(buf, help); send(s, buf, strlen(buf)); break; case GET_LED_CMD:        /*处理GET LED 命令*/ printf("GET_LED_CMD\r\n"); for(i = 0 ; i 3 ; i++){        sprintf(buf, "LED%bd is %s\r\n", i, ((P0 (i+3)) 0x01) ? "OFF" : "ON");        send(s, buf, strlen(buf)); } break; case LED0_ON_CMD:        /*处理LED0 ON命令*/ printf("LED0_ON_CMD\r\n"); sprintf(buf, "Turn ON the LED0\r\n"); send(s, buf, strlen(buf)); P0_3 = 0;       /* 将GPIO 0_3设置为0, 与低有效LED连接*/ break; case LED1_ON_CMD:/*处理LED1 ON命令*/ printf("LED1_ON_CMD\r\n"); sprintf(buf, "Turn ON the LED1\r\n"); send(s, buf, strlen(buf)); P0_4 = 0;       /*将GPIO 0_4设置为0, 与低有效LED连接*/ break; case LED2_ON_CMD:        /*处理LED2 ON命令*/ printf("LED2_ON_CMD\r\n"); sprintf(buf, "Turn ON the LED2\r\n"); send(s, buf, strlen(buf)); P0_5 = 0;        /* 将GPIO 0_5设置为0,与低有效LED连接*/ break; case LED0_OFF_CMD:        /* 处理LED0 OFF命令*/ printf("LED0_OFF_CMD\r\n"); sprintf(buf, "Turn OFF the LED0\r\n"); send(s, buf, strlen(buf)); P0_3 = 1;        /*将GPIO 0_3设置为1,与低有效LED连接*/ break; case LED1_OFF_CMD:        /* 处理LED1 OFF命令*/ printf("LED1_OFF_CMD\r\n"); sprintf(buf, "Turn OFF the LED1\r\n"); send(s, buf, strlen(buf)); P0_4 = 1;        /* 将GPIO 0_4设置为1,与低有效LED连接*/ break; case LED2_OFF_CMD:        /* 处理LED2 OFF命令*/ printf("LED2_OFF_CMD\r\n"); sprintf(buf, "Turn OFF the LED2\r\n"); send(s, buf, strlen(buf)); P0_5 = 1;        /* 将GPIO 0_5设置为,与低有效LED连接*/ break; case EXIT_CMD:        /*处理EXIT 命令*/ printf("EXIT command\r\n"); sprintf(buf, "EXIT command\r\n Good Bye~~\r\n Logout from W7100 TELNET"); send(s, buf, strlen(buf)); close(s); user_state = LOGOUT; break; default: break; } } 程序4.4proc_command()函数   4.5 willopt(), wontopt(), doopt()和dontopt()函数 willopt(), wontopt(), doopt()和dontopt()函数是用于协商Telnet选项的命令。它们需要socket s和选项作为输入参数。更多关于每个命令和选项的详细信息,请参阅表2.1和2.2。 void willopt(SOCKET s, int opt) { int ack; printf("Recv: will"); if(opt = NOPTIONS)  printf("%s\r\n", tel_options ); else  printf("%u\r\n", opt); switch(opt){ case TN_TRANSMIT_BINARY: case TN_ECHO: case TN_SUPPRESS_GA: ack = DO;     /*如果接收到‘WILL’并且它包含TN_SUPPRESS_GA选项,发送‘DO’ */ break; default: ack = DONT;  /* 拒绝其它未定义的命令*/   } sendIAC(s, ack, opt); }   void wontopt(SOCKET s, int opt) { printf("recv: wont"); if (opt = NOPTIONS)  printf("%s\r\n", tel_options ); else  printf("%u\r\n", opt); switch(opt){ case TN_TRANSMIT_BINARY: case TN_ECHO: case TN_SUPPRESS_GA:    /*如果接收到WONT带有TN_SUPPRESS_GA选项的命令*/ if (remote == 0){ remote = 1;     /*设置TN_SUPPRESS_GA选项*/ sendIAC(s, DONT, opt);  /* 发送带有TN_SUPPRESS_GA 选项的DONT命令*/ } break; } }   void doopt(SOCKET s, int opt) { printf("recv: do "); if (opt = NOPTIONS)  printf("%s\r\n", tel_options ); else  printf("%u\r\n", opt); switch(opt){ case TN_SUPPRESS_GA:      /*如果接收到带有TN_SUPPRESS_GA 选项的DO命令*/ sendIAC(s, WILL, opt);     /* 发送带有TN_SUPPRESS_GA选项的WILL命令*/ break; case TN_ECHO:    /* 如果接收带有TN_ECHO选项的DO命令*/ sprintf(buf, "WELCOME TO THE W7100 TELNET SERVER!!\r\nPlease insert your ID: "); send(s, buf, strlen(buf)); break; default: sendIAC(s, WONT, opt); } }   void dontopt(int opt) { printf("recv: dont "); if (opt = NOPTIONS) printf("%s\r\n", tel_options ); else printf("%u\r\n", opt); switch(opt){ case TN_TRANSMIT_BINARY: case TN_ECHO: case TN_SUPPRESS_GA:    /*如果接收带有TN_SUPPRESS_GA 选项的DON’T命令*/ if (remote == 0) remote = 1;  /*设置TN_SUPPRESS_GA选型*/ break; } } 程序4.5willopt(), wontopt(), doopt() and dontopt()函数     版权2011  WIZnet, Inc. 保留所有权利。 技术支援: wiznetbj@wiznettechnology.com 销售及分销: wiznethk@wiznettechnology.com   欲要更多详情,请查阅我们的网站http://www.wiznettechnology.cn     如果您有任何疑问,请直接留言或登录WIZ net官方网站:http://www.wiznettechnology.cn/ 或者来电:86-10-84539974(转166),QQ:2377211388, 邮箱:wiznetbj@wiznettechnology.com  联系人:Jerry ,谢谢!
  • 热度 23
    2012-7-9 10:45
    1535 次阅读|
    0 个评论
      在上篇博文( 如何使用W7100A实现Telnet服务器(一) )里我们简单地介绍一下Telnet,第三章将会演示Telnet函数的具体功能,第四章将涉及到代码的分析。这篇文档中所有的示例代码都是基于Keil uVision3。 第一部分在这里: http://forum.eet-cn.com/BLOG_ARTICLE_12989.HTM 下面我们介绍第二部分(包括第三章以及第四章的一部分):     3. Telnet演示 本章将演示前面所介绍的Telnet。下载用来演示Telnet的telnets.hex到EVB,以此来控制与GPIO端口连接的LED0、LED1和LED2。iMCU7100A-EVB将会作为Telnet服务器,用户PC机将会作为Telnet客户端。该示例的调试信息将会通过串口输出,因此可以打开一个串口终端程序来查看调试信息。在该演示中,我们将使用Windows自带的超级终端机。 连接iMCU7100A-EVB的电源线、网线以及Telnet演示需要的串口线。更多iMCU7100A-EVB开发板的信息,请参考文档‘iMCU7100A-EVB用户指南’。利用W7100 Debugger或者WizISP程序将‘Telnet服务器HEX文件’烧录到iMCU7100A-EVB中。若使用WizISP程序,用串行线连接PC机和开发板。若使用W7100A Debugger程序时,则选择用调试器线连接PC机和开发板。更多关于iMCU7100调试器程序和WizISP程序的信息,请参阅‘W7100A调试器指南’和‘W7100A的WizISP程序用户指南’。这些程序都包含在EVB附带的CD中,也可以从WIZnet主页上下载。     (a) W7100调试器                                  (b) WizISP          图3.1 W7100ADebugger和WizISP程序界面 将telnets.hex烧录到iMCU7100EVB开发板之后,打开超级终端机(Hyper terminal)程序。如果使用WizISP程序,关闭EVB开发板上的BOOTSEL引脚并且复位EVB开发板。如果要使用Debugger程序,点击‘运行’或者结束Debugger并且复位EVB开发板。COM2端口的设置如图3.2,该端口是测试PC机正在使用的串行端口号。该端口号应该根据用户PC机的设置来设定,波特率等的设置也应该根据代码进行修改。如果超级终端机(Hyper terminal)设置正确,将会显示如图3.3的信息。   图3.2超级终端机(Hyper terminal)设置   图3.3超级终端机(Hyper terminal)信息   使用超级终端机(Hyper terminal)检查输出Telnet服务器的IP地址,并且打开命令窗口输入“telnet 192.168.1.2”。Telnet服务器IP应该根据用户网络进行设置。先使用一个虚拟的IP:192.168.1.2来测试代码。在连接Telnet服务器成功之后,输入ID和PW。用户可以使用任意一个ID和PW登录。测试代码中的很多命令都能够在登录后使用。这些命令列在表3.1中,执行命令的过程如图3.4所示。用户可以使用Telnet终端机和超级终端机(Hyper terminal)来查看这些命令执行的结果。 表3.1 用于Telnet的命令 命令 描述 HELP 显示所有有效命令 GET LED 显示所有LED的状态 LED0 ON 打开LED0 LED1 ON 打开LED1 LED2 ON 打开LED2 LED0 OFF 关闭LED0 LED1 OFF 关闭LED1 LED2 OFF 关闭LED2 EXIT 退出telnet服务器         图3.4 Telnet终端机运行信息 用户可以用‘LEDx ON/OFF’命令来打开/关闭LED,并且利用‘GET LED’命令远程确认LED的状态。在图3.4中,LED0、LED1和LED2都是打开的。如图3.5,LED的状态可以只通过查看iMCU7100A-EVB上的灯来检查。     图3.5 iMCU7100EVB与Telnet服务器运行 4 程序代码 这一章将介绍烧录到iMCU7100A-EVB上的Telnet服务器的示例代码。更多关于通过交换Telnet信息用到的TCP的内容,请参考文档‘如何使用W7100A实现TCP通信’。这一章将会更进一步解释说明main()函数内的TELNET()函数;将不再涉及到MCU初始化或者网络初始化的代码。 4.1 TELNETS()函数 TELNETS()是用来运行Telnet服务器的基本函数,它基于TCP来创建一个socket并且等待来自客户端的连接。在与客户端连接之后,调用init_telopt()函数来协商Telnet选项。为了进入命令模式,调用tel_input()函数。下一节将会进一步介绍init_telopt()函数和tel_input()函数的作用。Telnet使用的Socket s可以从0到7。根据Telnet标准,Telnet默认的端口号是23。 void TELNETS(SOCKET s, uint16 port) { uint8 first; switch(getSn_SR(s))    /*获取socket s的声明*/ { case SOCK_ESTABLISHED:    /* 如果建立socket*/     if(first == 1)     /* 如果首先与客户端连接*/     {       printf("W7100 TELENT server started via SOCKET%bu\r\n", s);       init_telopt(s);     /*初始化并且协商选项*/       first = 0;     }     if((getSn_RX_RSR(s)) 0)  tel_input(s);  /*如果有任何接收数据,处理它*/     break; case SOCK_CLOSE_WAIT:     disconnect(s);    /*断开socket s连接*/     break; case SOCK_CLOSED:     printf("Close SOCKET:%bu\r\n", s);     close(s);    /*关闭socket s */     socket(s, Sn_MR_TCP, port, 0);    /* 打开用于TCP的socket s*/     break; case SOCK_INIT:     listen(s);    /* 监听socket s */     printf("Listen SOCKET:%bu for Telnet server\r\n", s);     user_state = USERNAME;     first = 1;     break; }  /* 终止switch */ }  /* 终止TELNETS函数*/ 程序4.1TELNETS()函数     4.2 init_telopt()和sendIAC()函数 Init_telopt() 函数用来协商Telnet服务器和客户端之间的选项。由于只有ECHO选项用来测试代码,用户可以只使用WILL命令进行协商。如第二章所提到的,当发送控制字符时必须一起发送IAC(0xFF)字符。SendIAC()函数用来发送IAC字符和控制字符。 void init_telopt(SOCKET s) { sendIAC(s, WILL, TN_ECHO);    /* 协商ECHO选项*/ }   void sendIAC(SOCKET s, char r1, char r2) { switch(r1) { case WILL:    /* WILL命令*/ printf("sent: will"); break; case WONT:    /* WONT命令*/ printf("sent: wont"); break; case DO:    /*DO命令*/ printf("sent: do"); break; case DONT:     /* DON’T命令*/ printf("sent: dont"); break; } if(r2 = NOPTIONS)  printf("%s\r\n", tel_options );   else  printf("%u\r\n", r2); sprintf(buf, "%c%c%c", IAC, r1, r2); send(s, buf, strlen(buf));     /*向客户端发送IAC,命令和选项*/ } 程序4.2init_telopt()和sendIAC函数     如果您有任何疑问,请直接留言或登录WIZ net官方网站:http://www.wiznettechnology.cn/ 或者来电:86-10-84539974(转166),QQ:2377211388, 邮箱:wiznetbj@wiznettechnology.com  联系人:Jerry ,谢谢!
  • 热度 29
    2012-7-6 09:20
    1473 次阅读|
    0 个评论
      这篇文档将会介绍Telnet以及使用iMCU7100EVB来实现Telnet服务器。除了连接到iMCU。用户可以用Telnet来控制LEDs。在第二章我们简单地介绍一下Telnet,第三章将会演示Telnet函数的具体功能,第四章将涉及到代码的分析。这篇文档中所有的示例代码都是基于Keil uVision3。 1.这里我们先分享前面部分,希望对大家有所帮助。   2. Telnet Telnet是用于因特网或者局域网的网络协议,它可以为设备间提供一个双向的交互式通信。Telnet起源于RFC15,于1969年发展起来,随后开始标准化。带有TCP/IP协议栈的网络设备基本都支持Telnet服务。Telnet是一个广泛用于客户端/服务器的应用程序。 由于越来越多具有便捷功能浏览器的出现,Telnet的重要性逐渐降低。但是telnet对于众多用于远程连接的多用户电脑来说,仍然是一个很重要的工具;用户可以从住处、工作地点或者任何地方通过因特网连接到telent服务器。   图 2.1Telnet系统 2.1         NVT (网络虚拟终端) 对于用户来说,远程连接Telnet服务器的过程比较复杂。由于电脑将接收的特殊字符组合作为一个标记;同时根据OS的不同,这个特殊字符的组合也会不同,因此Telnet定义了一个NVT来解决这个问题。通过使用NVT,Telnet客户端将本地终端输入的字符组合转换成NVT格式,然后发送到网络。Telnet服务器将接收到的NVT格式字符转换成远程电脑可以接收和读取的格式。这个过程如下图2.2所示。   图2.2Telnet系统的NVT NVT使用了两类字符组合;一个是用于数据,另外一个是用于远程控制。 用于数据的NVT通常使用NVT ASCII。NVT ASCII是一个8位的字符组合;较低7位与美国的ASCII相同,最高位为0。当最高位是1时,必须提前定义并在Telnet客户端和服务器之间的进行协商。 用于远程控制的NVT利用一个最高位置为1的8位控制字符。当发送用于进入特殊键的远程控制字符,设置连接和改变状态之前,先发送使用TCP的IAC(中断命令,值为0xFF)。因此,在IAC字符后接收到的字节会被看作远程控制字符。   表2.1NVT控制字符 控制字符 值 释义 EOF 236 文档结束 EOR 239 记录结束 SE 240 次选项结束 NOP 241 无操作 Data Mark 242 同步信道的数据流部分。这个应该带有一个TCP紧急通知。 Break 243 NVT 字符BRK Interrupt Process 244 暂停,中断,终止或者结束与NVT连接的进程。同时,用于TELNET的其它协议的的部分外频信号都可能发生中断进程。 Abort output 245 允许当前的进程(出现)运行完成,但是不发送给用户它的输出。同时,向用户发送同步信道。 Are You There 246 回送给NVT一些可见的(例如:可打印的) 证据证明AYT接收到 Erase character 247 接收端应该从数据流中删除上一个之前未删除字符或者“打印位置”。 Erase Line 248 接收端一个删除数据流回送来的字符,但是不包括,上一个通过TELNET连接发送来的“CR LF”序列。 Go ahead 249 GA信号 SB 250 表示接下来的是指示选项的次协商。 WILL 251 表示开始执行的目的,或者确认你正在执行,指示选项。 WONT 252 表示拒绝执行,或者继续执行,指示选项。 DO 253 表示其它部分执行的请求或者确认你希望其它部分执行,指示选项。 DON’T 254 表示要求其它部分停止执行,或者确认你不再希望其它部分执行,指示选项。 IAC 255 中断命令。   2.2   用于Telnet终端的选项 正如之前提到的,客户端和服务器之间的选项能够在使用Telnet服务时进行协商。下表中显示了一些通用选项。 表2.2telent选项 选项ID 名称 备注 1 回显(Echo) RFC857 3 抑制前进(Suppress go ahead) RFC858 5 状态(Status) RFC859 6 时序标记(Timing mark) RFC860 24 终端类型(Terminal type) RFC1091 31 窗口大小(Window size) RFC1073 32 终端速度(Terminal speed) RFC1079 33 远程流控制(Remote flow control) RFC1372 34 行模式(Line mode)) RFC1184 36 环境变量(Environment variables) RFC1408     在使用Telnet选项时必须用到客户端和服务器之间的协商选项。如表2.1所示,4个控制字符(WILL、WONT、DO以及DONT)用于选项协商。 为了能够激活选项,发送端发送WILL命令,询问“可以激活该选项吗?”然后,接收端将会发送DO命令,表示接受,或者DONT命令,表示拒绝。另外一种激活选项的方法是发送DO命令,表示“激活该选项”,并且接收端回送WILL命令或者WONT命令。 使选项无效的过程如下。发送端发送WONT命令,表示“不再使用该选项”。然后,接收端将会回送DO命令接受或者DONT命令拒绝。   图2.3telnet选项协商 2.3    Telnet操作模式 大多数Telnet的操作执行有三种模式:普通模式(General mode)、字符模式(Character mode),以及行模式(Line mode)。 - 普通模式 (General mode) :这是选项协商在不选择字符或者行模式时最基本的模式。在这种模式下,回送所有的输入字符,直到一行完成才发送。 在向服务器发送完所有的行后,客户端等待GA命令直到一个新的行被接受。如果TCP连接是全双工的, 那么这种模式就是无效的,因为一般的Telnet工作于半双工模式。 - 字符模式 (Character mode) : 当客户端输入字符时,每一个字符都被发送给服务器。服务器允许回送字符显示在客户端的屏幕上。在这种模式下,当回送字符的传输太慢时,可能会发生一些延时;此时,将会增加网络的负荷。 - 行模式(Line mode) : 一般情况下,建议使用行模式(Line mode),它可以覆盖普通模式(General mode)和字符模式(Character mode)的缺点。在这种模式下,用户的行编辑(回送,删除字符,删除行等等)都是可以的。在行被编辑完成后,发送给服务器。行模式以全双工模式执行,并且所有行可以不需要GA命令即被发送。   好了,这就是我们今天的内容,后续部分我们将尽快发布,谢谢关注。   如果您有任何疑问,请直接留言或登录WIZ net官方网站:http://www.wiznettechnology.cn/ 或者来电:86-10-84539974(转166),QQ:2377211388, 邮箱:wiznetbj@wiznettechnology.com  联系人:Jerry ,谢谢!
  • 热度 32
    2012-3-19 11:22
    2212 次阅读|
    0 个评论
    Telnet的应用不仅方便了我们进行远程登录,也给hacker们提供了又一种入侵手段和后门,但无论如何,在你尽情享受Telnet所带给你的便捷的同时,你是否真正的了解Telnet呢?那么就让我们来认识一下远程登录。 今天我们就给大家介绍下Telnet,通过使用W5200E01-M3登录Telnet服务器。     当使用Telnet时可以控制直接与W5200E01-M3的GPIO端口相连接的LED3和4,除此之外没有别的关于Telnet的系统。第一部分我们主要讲给大家阐述一下Telnet一些功能,第二、三部分给大家分析一些基于IAR编译器的代码例子。 我们知道Telnet服务器软件是我们最常用的远程登录服务器软件,是一种典型的客户机/服务器模型的服务,它应用Telnet协议来工作。那么,什么是Telnet协议?它都具备哪些特点呢? 1. 基本内容 Telnet(teletype network)是位于OSI模型的第7层---应用层上的一种协议,是一个通过创建虚拟终端提供连接到远程主机终端仿真的TCP/IP协议。这一协议需要通过用户名和口令进行认证,是Internet远程登陆服务的标准协议。应用Telnet协议能够把本地用户所使用的计算机变成远程主机系统的一个终端。它提供了三种基本服务:1)Telnet定义一个网络虚拟终端为远程系统提供一个标准接口。客户机程序不必详细了解远程系统,他们只需构造使用标准接口的程序;2)Telnet包括一个允许客户机和服务器协商选项的机制,而且它还提供一组标准选项;3)Telnet对称处理连接的两端,即Telnet不强迫客户机从键盘输入,也不强迫客户机在屏幕上显示输出。 Telnet作为一种标准的网络协议被广泛的应用于客户/服务器应用编程中,越来越多的浏览器引进很多的便捷功能,应用Telnet已经显得越来越重要了。Telnet也是很多个人电脑和多用户帐号远程连接的一种工具,用户可以在家里,办公室或者任何一个地方连接Telnet服务器。     2. 网络虚拟终端NVT(Net Virtual Terminal) 总体来说,对于用户来说远程连接Telnet服务器相当复杂因为计算机和OS(操作系统)接受特殊字符的组合作为标记,这个特殊字符的组合是根据OS的不同,Telnet定义了一个叫做NVT(网络虚拟终端)接口来解决这个问题。通过使用这个接口,Telnet客户端转换从本地终端NVT格式输入的的字符组合,并把它发送到网络。然后Telnet服务将接收到的NVT格式字符器转换成远程计算机可以接受和阅读的格式,图2给出了这个过程。   NVT使用两种字符组合:数据使用和用于远程控制使用。NVT数据使用通常是NVT ASCII码。 NVT ASCIII是一个8位的字符组合,较低的7bits是美国ASCII相同,最高位为0。最高位可以是1或0的情况下,它是1。 Telnet客户端和服务器之间的选项协商,必须事先定义。 当发送用于进入特殊键的远程控制字符,设置连接,改变状态之前,NVT进行远程控制使用一个8位的控制字符的最高位设置为1,发送IAC(中断命令,值为0xFF )使用TCP。因此,当收到IAC 字符后接收到会被识别成是远程控制字符。 3.Telnet 中断选项 如前所述,当使用Telnet服务之前或者之后,客户端和服务器之间的选项都可以协商,下表列出了一些常用的选项。Telnet选项被定义为的Telnet的第一版本的一部分,并在许多RFC文档中进行了补充。 使用各种选择的telnet客户端和服务器之间的选项协商是必要的,如表2所示。4个控制字符(WILL, WONT, DO, and DON’T)是用于协商的选项。   为了激活选项,发送器发送WILL命令,询问:“我可能会激活此选项吗 ” 然后,接收器将发送DO命令,意思是接受了或发送DON’T命令,这意味着拒绝。激活选项的另一种方式是发送DO命令,意思是“激活此选项, ”接收器会发回将WILL命令或WONT命令。 停用选项的过程如下,发射机发送WONT命令,意思是“我不会再使用这个选项。然后,接收器将发回DO命令接受或DONT命令拒绝。   4.Telnet操作模式 Telnet的大多数业务处理3种模式:一般模式,字符模式和行模式。 一般模式 :当不从协商选项中选定字符或者行模式的时候,这种模式的基本模式。在这种模式下,客户端呼应所有输入字符,直到一条线完成后再发送。 当所有的行发送到服务器,客户端等待GA命令直到一个新的命令接受了。当TCP连接的时候这种模式可能无效,因为TCP连接是全双工的,而一般的Telnet是在半双工运作。 字符模式 :在这种模式下,客户端输入的每个字符都是被独立地发送到服务器。服务器通常允许客户端的屏幕上出现回声字符。在这种模式下,可能会出现一些延迟回声字符的这时传输速度也会变慢。 行模式 :行模式弥补了一般模式和字符模式的缺陷。在这种模式下,客户端可能进行行编辑(删除字符,删除行等),然后它们被发送到服务器。行模式运行在全双工模式下,行可以被发送而没有收到GA命令。   了解 Telnet 的相关知识,我们将在今后的博客中着重介绍它的相关技术以及代码分析,以满足广大关注者的需要。 欢迎大家留言评论哦~~
相关资源