首先要了解telnet协议,一下两篇blog给了我初步的思路
https://www.cnblogs.com/liang-ling/p/5833489.html 这篇有比较基础的介绍 以及iac命令含义解释
https://www.cnblogs.com/image-eye/archive/2012/03/28/2421726.html 这篇就很能抓住重点 另外这位博主使用的是c# 写的程序十分完整 我这里关于iac指令处理有部分是直接借鉴他的程序 因此注释都没有修改仍然使用的是他的注释
以上两篇大致看过之后 就可以了解本次po出来的程序了 内容较为朴素
utils.h
#ifndef __utils__h #define __utils__h #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <stdarg.h> #include <fcntl.h> #include <fcntl.h> #include <sys/poll.h> #include <signal.h> #include <sys/wait.h> typedef signed long int ssize_t; typedef unsigned long int size_t; ssize_t readn(int fd, void *vptr,size_t n); ssize_t writen(int fd, const void *vptr, size_t n); ssize_t readline(int fd,void *vptr,size_t maxlen); #endif
utils.c
#include"utils.h" ssize_t readn(int fd, void *vptr,size_t n) { size_t nleft; ssize_t nread; char *ptr; ptr = vptr; nleft = n; while(nleft >0) { if((nread = read(fd,ptr,nleft))<0) { if(errno == eintr)//error:为eagain,表示在非阻塞下,此时无数据到达,立即返回。 nread = 0; //error:为eintr,表示被信号中断了。 else return (-1); } else if(nread == 0) break; else /* do nothing */ nleft -= nread; ptr += nread; } return n-nleft;//实际读了多少字节 } ssize_t writen(int fd, const void *vptr, size_t n) { size_t nleft; ssize_t nwritten; const char *ptr; ptr = vptr; nleft = n; while(nleft > 0) { if((nwritten = write(fd,ptr,nleft)) < 0) { if(nwritten <0 && errno == eintr) { nwritten = 0; } else return (-1); } else if(nwritten == 0) break; else //nwritten > 0 { /*do nothing*/ } nleft = nleft - nwritten; ptr = ptr + nwritten; } return (n- nleft);//实际写了多少字节 } ssize_t readline(int fd,void *vptr,size_t maxlen) { ssize_t n =0,rc; char c,*ptr; ptr = vptr; while(1) { if((rc = read(fd,&c,1)) == 1) { *ptr++ = c; n++; if(c == 'n') break; } else if (rc == 0) { *ptr = '