自己实现telnet程序

2023-10-27

转自:http://blog.csdn.net/gujintong1110/article/details/44278535

#include <stdio.h>  
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>  
#include <sys/types.h>
#include <sys/wait.h>
#include <pthread.h>

int save_fd;
#define BUFSIZE 1024
/*telnet_cmd:ff fb 01 ff fb 03 ff fc 1f*/
const unsigned char cmd_telnet[9] = {0xff, 0xfb, 0x01, 0xff, 0xfb, 0x03, 0xff, 0xfc, 0x1f};
char cmdLine[1024] = {0};

void task_process(int sockfd);
int telnetd(void);
void *telnetd_pthread(void * arg);
void *task_process_pthread(void *arg) ;

/*启动telnet服务*/
int telnetd_start()
{
#if 1
    pthread_t id;
    int i,ret;

    ret=pthread_create(&id,NULL,(void *) telnetd_pthread,NULL);
    if(ret!=0){
        printf ("Telnet: telnet_starting.......err!\n");
        return -1;
    }

#else 
    int pid;
    int status;

    if(pid=fork()) {
        //exit(0);        //是父进程,结束父进程
        waitpid(-1, &status, WNOHANG | WUNTRACED | WCONTINUED);
        return 0;
    } else if(pid < 0) {
        return -1;//exit(1);        //fork失败,退出
    }
    printf("Telnet: telnet_starting.......\n");
    telnetd();
#endif  
}


/*telnet 主服务任务*/
//int main(int argc, char *argv[])
int telnetd(void)  
{  
    pid_t fpid;
    int status;
    int server_sockfd;//服务器端套接字  
    int client_sockfd;//客户端套接字  
    int len;  
    struct sockaddr_in server_addr;   //服务器网络地址结构体  
    struct sockaddr_in remote_addr; //客户端网络地址结构体  
    int sin_size;  
    memset(&server_addr,0,sizeof(server_addr)); //数据初始化--清零  
    server_addr.sin_family=AF_INET; //设置为IP通信  
    server_addr.sin_addr.s_addr=htonl(INADDR_ANY);//服务器IP地址--允许连接到所有本地地址上  
    server_addr.sin_port=htons(23); //服务器telnet端口号  

    //init_telnetd();

    /*创建服务器端套接字--IPv4协议,面向连接通信,TCP协议*/  
    if((server_sockfd=socket(AF_INET,SOCK_STREAM,0))<0)  
    {    
        perror("socket");  
        return -1;  
    }  

        /*将套接字绑定到服务器的网络地址上*/  
    if (bind(server_sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))<0)  
    {  
        perror("bind");  
        return -1;  
    }  

    /*监听连接请求*/  
    listen(server_sockfd,1);  

    printf("Telnet: listening for telnet requests....\n");

    sin_size=sizeof(struct sockaddr_in);  
    while(1) {      
        /*等待客户端连接请求到达*/  
        if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)  
        {  
            perror("accept");  
            return 1;  
        }  
        //printf("accept client %s\n",inet_ntoa(remote_addr.sin_addr));  
#if 0       
        fpid = fork();
        if (fpid < 0) {
               perror("call fork() err!\n");
               exit(1);
        } else if (fpid == 0) {
               task_process(client_sockfd);
               close(client_sockfd);
               exit(0);
        } else {
            waitpid(-1, &status, WNOHANG | WUNTRACED | WCONTINUED);
        }
#else 
        pthread_t id;
        int i,ret;

        ret=pthread_create(&id,NULL,(void *) task_process_pthread,(void *)client_sockfd);
        if(ret!=0){
            printf ("Telnet: telnet_starting.......err!\n");
            return -1;
        }
        pthread_join(id,NULL);
#endif      

    }   
    close(client_sockfd);  
    close(server_sockfd);  
    return 0;   
} 
void * telnetd_pthread(void *arg)
{
    telnetd();  
}
/*发送telnet协议命令*/
int send_telnet_cmd(int fd)
{
    return write(fd, cmd_telnet, sizeof(cmd_telnet));
}
/*读取命令字符串*/
int read_cmdline(int sockfd, char *cmdLine, int size)
{
    int ret, rev_count = 0;
    char *buf = NULL;
    buf = cmdLine;
    while(1 == (ret = read(sockfd, buf, 1))) {
        rev_count++;
        if(rev_count > BUFSIZE - 2) {
            return rev_count;
        }
        if(*buf == '\n') {
            return rev_count;
        }
        buf++;
    }
    return ret;
} 
/*输出重定向*/
int ioStdSet(int src_fd, int dest_fd, int *save_fd) 
{
    *save_fd = dup(dest_fd);
    dup2(src_fd, dest_fd);
    //close(src_fd);
    return *save_fd;
}
/*恢复输出重定向*/
void recoverIoStdSet(int src_fd, int dest_fd) 
{
    dup2(src_fd, dest_fd);
    close(src_fd);
}
/*解析字符串*/
int cmd_analyze(char *cmd)
{
    unsigned char *ptr = NULL;
    unsigned char *ptr_tmp;

    if(strlen(cmd) < 12 || strlen(cmd) > 48) {
        return -1;
    }
    /*去除多余的换行符及其他多余字符*/
    while((ptr = strstr(cmd, "\r")) != 0 ) {
        while(*ptr != 0) {
            *ptr = *(ptr+1);
            ptr++;
        }
    }

    while((ptr = strstr(cmd, "\n")) != 0 ) {
        while(*ptr != 0) {
            *ptr = *(ptr+1);
            ptr++;
        }
    }

#if 1
    ptr = cmd;
    while((!((*ptr > 'a' && *ptr < 'z') || (*ptr > 'A' && *ptr < 'Z') || (*ptr > '0' && *ptr < '9'))) && (*ptr != 0)) {
        ptr_tmp = ptr;
        while(*ptr_tmp != 0) {
            *ptr_tmp = *(ptr_tmp+1);
            ptr_tmp++;
        }
    }

#endif  
    if(strlen(cmd) < 12 || strlen(cmd) > 48) {
        return -1;
    }
    return 0;
}
/*执行命令并回显到telnet终端*/
int cmd_process(int fd, char *cmdLine)
{
    ioStdSet(fd, 1, &save_fd); /*标准输出重定向*/

    /*这里添加命令处理函数*/
    /*示例*/
    printf("Welcome to Telnet server.[%s]\n",cmdLine);

    recoverIoStdSet(save_fd, 1); /*恢复输出重定向*/
    return 0;
}
/*telnet交互处理函数*/
void task_process(int sockfd)
{
    char cmdLine[BUFSIZE]={0};
    int count = 0;
    int i=0,tmp = 0;
    int ret;

    while(1) {

        send_telnet_cmd(sockfd);

        ioStdSet(sockfd, 1, &save_fd);
        printf("\r\r\nlinux>");
        recoverIoStdSet(save_fd, 1);

        memset(cmdLine, 0, sizeof(cmdLine));

        count = read_cmdline(sockfd, cmdLine, BUFSIZE);
        if(count <= 0) {
            //perror("read err");
            //exit(1);对方断开连接,返回
            return ;
        }
        ret = cmd_analyze(cmdLine);
        //printf("[%s,%d]rev count:%d,buf:%s\n",__FUNCTION__,__LINE__,count, cmdLine);
        if(ret == 0) {
            cmd_process(sockfd, cmdLine);
        }

    }
}
void *task_process_pthread(void *arg) 
{
    int sockfd;
    sockfd = (int) arg;
    task_process(sockfd);

     pthread_exit((void *)1);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自己实现telnet程序 的相关文章

  • centos7开启telnet登陆

    centos7安装telnet xff0c 开启telnet登陆 xff1a xff08 1 xff09 安装命令 xff1a yum install telnet server yum install xinetd xff08 2 xff
  • linux找不到telnet命令,Linux安装telnet

    一 安装telnet 1 检测telnet server的rpm包是否安装 root 64 localhost rpm qa telnet server 若无输入内容 xff0c 则表示没有安装 出于安全考虑telnet server rp
  • linux – telnet 【host】【port】,设置超时时间

    http www cocoachina com articles 51080 这将运行不超过2秒 xff1a span class token keyword echo span quit span class token operator
  • 2022年网络安全比赛--压缩包文件暴力破解中职组(超详细)

    2022年比赛压缩包文件暴力破解解析 一 竞赛时间 180分钟 共计3小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1 通过本地PC中渗透测试平台Kali使用Nmap扫描目标靶机服务版本信息 将 Telnet 版本信息字
  • Centos7 报错:Trying 172.16.14.22... telnet: connect to address 172.16.14.22: Connection timed out

    最近在Centos7上配置telnet服务一直提示报错 Trying 172 16 14 22 telnet connect to address 172 16 14 22 Connection timed out咨询了很多人也百度了很多办
  • nginx启动成功进程正常,浏览器访问不了,欢迎页面不出现

    自己搭建了nginx tomcat 部署到服务器上面 装好nginx 为了避免冲突 把其他进程都检查了一遍 没有占用80端口 所以默认使用80端口 安装好后 启动nginx ps ef grep nginx 进程正常 使用浏览器访问时发现访
  • Golang实现Telnet回音服务器

    码上见 package main import bufio fmt net os strings 服务端连接 func server address string exitChan chan int l err net Listen tcp
  • C# SuperSocket 手把手教你入门 傻瓜教程---3(Telnet服务器和客户端请求处理)

    C SuperSocket 手把手教你入门 傻瓜教程系列教程 C SuperSocket 手把手教你入门 傻瓜教程 1 服务器单向接收客户端发送数据 C SuperSocket 手把手教你入门 傻瓜教程 2 服务器和客户端双向通信 C Su
  • java 使用套接字的简单 telnet 客户端

    我读过很多关于这个主题的东西 telnet 是一个协议 而不是一个简单的套接字连接 等待换行符 使用外部库等等 最重要的是 我需要一个快速而肮脏的 java telnet 应用程序启动并运行 不一定可扩展 也不一定漂亮 所以我试图避免使用库
  • 如何使用 telnet 测试我的 LDAP 服务器 URL

    我的本地和远程都有一个 LDAP 服务器 我可以 telnet 到本地 ldap url 但无法 telnet 到远程 telnet www ilovebears com 389我得到一个空屏幕 光标闪烁 这是因为某些套接字配置还是端口不可
  • 解析 ANSI 转义码?

    我正在用 C 构建一个 telnet 应用程序 用于在老式 BBS 系统上编写门游戏脚本 例如 Wildcat 但似乎无法为 ANSI 转义码 例如光标移动 着色等 构建一个可用的解析器 几乎所有系统我 已经测试过发送不符合任何 标准 的未
  • 如何在telnet客户端上实现命令历史记录? (向上/向下箭头)

    我有一台接受 telnet 连接进行管理的服务器 我错过了命令历史记录 因此我想让我的 telnet 会话支持它 我的问题 1 我是否必须在服务器端实现这一点 以便服务器将过去的命令发送到客户端 然后客户端可以重新执行 2 是否有办法在te
  • 如何使用 TO Telnet 抑制回声?

    使用 Indy10 DelphiXE 如何告诉我正在连接的 telnet 服务器TIdTelnet不回显我向 telnet 服务器发送的命令 这是我当前的尝试 不起作用 我尝试在每次 telnet 写入时发送序列 IAC DO SUPPRE
  • 为 Telnet 会话创建脚本?

    有谁知道创建一个可以连接到 telnet 服务器的脚本的简单方法 执行一些常见的 telnet 操作 然后注销 我正在与不熟悉 telnet 及其需要运行的命令的用户打交道 我想要的只是让他们双击脚本 然后让该脚本自动为他们执行命令 您可能
  • 为什么我无法通过 SMTP 远程登录到 gmail?

    我尝试连接并使用 telnet 到 gmail 服务进行测试 telnet gmail smtp in l google com 25 然而它说 连接到 gmail smtp in l google com 失败 无法在端口 25 上打开与
  • 如何使用 C/Objective C 获取 telnet 结果?

    这是一个 telnet 站点 远程登录 202 85 101 136 8604 它来自香港公共图书馆 我可以编写一些程序从telnet服务获取字符串 结果 并从C Objective C发送请求吗 thz u 当然有可能 Telnet 是一
  • Server单个端口(socket)最大并发连接数

    可以在同一端口 单套接字 上与服务器通信的并发客户端 使用不同端口号 的最大数量是多少 哪些因素可能影响这个计数 我正在 Linux 环境中寻找有关 telnet 的信息 这部分取决于您的操作系统 然而 对特定端口没有限制 然而 并发连接的
  • Python 脚本 - 连接到 SSH 并运行命令

    我已经知道有 Python 的 ssh 模块 但这不是我正在寻找的 我想要的是一个 python 脚本来执行以下操作 gt 连接到 用户输入 SSH 主机 gt 使用凭据 由用户提供 连接 gt 在 SSH 主机上运行命令 telnet 到
  • 在“expect”中使用条件语句

    我需要使用自动登录到 TELNET 会话expect 但我需要处理同一用户名的多个密码 这是我需要创建的流程 打开与 IP 的 TELNET 会话 发送用户名 发送密码 密码错误 再次发送相同的用户名 然后发送不同的密码 此时应该已经成功登
  • 箭头键变成 Telnet 中的控制字符

    我在 Ubuntu 终端中 并通过 telnet 连接到服务器 现在每当我输入 up 时 它就会变成 A 其他箭头键也变成控制字符 有没有办法可以运行 telnet 以便它理解我的箭头键 这将是一个巨大的帮助 因为我想在我的命令历史记录中向

随机推荐

  • 总结内存(RAM或ROM)和FLASH存储的真正区别

    本文主要向大家介绍了内存 RAM或ROM 和FLASH存储的真正区别 通过具体的分析 让大家能够了解它们 希望对大家学习内存 RAM或ROM 和FLASH存储有所帮助 1 什么是内存 什么是内存呢 在计算机的组成结构中 有一个很重要的部分
  • C++ 迭代器,常用五种迭代器

    一文读懂C 五种常用的迭代器 c STL迭代器 iterator C 迭代器 什么是迭代器 好怪异的名词 搞了好多年都没有搞懂 说白了 迭代器 就是 开瓶器 而已 开瓶器的种类 有开啤酒瓶的 有开红酒瓶的 还有其他xx的 它们的目的 都是为
  • 再谈优雅重试(retry)机制

    业务场景 应用中需要实现一个功能 需要将数据上传到远程存储服务 同时在返回处理成功情况下做其他操作 这个功能不复杂 分为两个步骤 第一步调用远程的Rest服务逻辑包装给处理方法返回处理结果 第二步拿到第一步结果或者捕捉异常 如果出现错误或异
  • 顾客端我的订单开发心得与体会

    顾客端中有一个我的订单 显示已经点了的菜品 点了菜的话会把这个菜品的信息放入到餐桌的缓存中 我的订单的菜品是从这个缓存中取出来的 进入我的订单是个刷页 就是把需要的信息放在model里返回给jsp页面 jsp页面中有input标签 刚弄好了
  • OutPutStream输出文件

    package zmx Io import java io File import java io FileNotFoundException import java io FileOutputStream import java io I
  • 地理信息安全在线培训考试系统题库-单选题

    根据 测绘成果管理条例 利用涉及国家秘密测绘成果开发生产的产品 未经 A 进行保密技术处理的 其秘密等级不得低于所用测绘成果的秘密等级 A 国务院测绘行政主管部门或者省 自治区 直辖市人民政府测绘行政主管部门 B 省级以上保密管理部门 C
  • 超市运营情况分析

    超市运营情况分析 本文选取的数据源涵盖了2017年至今的客户 订单 地点和产品数据 本文主要聚焦出现负利润的省 自治区的运营情况 对其出现负利润的原因加以探讨 并分析预测这些省 自治区未来的利润情况 对超市的运营管理决策提供有效的数据支持
  • Shell数组:shell数组的定义、数组长度

    Shell在编程方面比Windows批处理强大很多 无论是在循环 运算 bash支持一维数组 不支持多维数组 并且没有限定数组的大小 类似与C语言 数组元素的下标由0开始编号 获取数组中的元素要利用下标 下标可以是整数或算术表达式 其值应大
  • qt超易实现录屏程序的方法

    QT录屏程序的实现 1 获取桌面的图像 The QApplication desktop function is used to get an instance of QDesktopWidget QApplication desktop
  • Git删除本地在远端已经删除的分支

    git remote prune origin
  • python gzipped source tarball,下载及安装Python详细步骤

    安装python分三个步骤 下载python 安装python 检查是否安装成功 1 下载Python 2 选择下载的版本 3 点开Download后 找到下载文件 Gzipped source tarball 是Linux系统下载的版本
  • python3.7成功换虚拟环境python3.6

    目录 1 打开CMD 查看自己有多少虚拟环境 2 打开anaconda prompt 终端 创建 3 6环境 3 在pycharm中从3 7正确换配置为3 6环境 1 打开CMD 查看自己有多少虚拟环境 C Users Administra
  • shell 中的单行注释和多行注释

    今天在学习shell编程的时候 当自己想对多行进行注释时 发现自己不会 所以在网上去查询下 参考 作者 lansesl2008 地址 http blog csdn net lansesl2008 article details 205583
  • 疯传全网网络10个运维巡检脚本以及使用小技巧

    哈喽大家好 欢迎来到虚拟化时代君 XNHCYL 大家好 我是虚拟化时代君 一位潜心于互联网的技术宅男 这里每天为你分享各种你感兴趣的技术 教程 软件 资源 福利 每天更新不间断 福利不见不散 第1章 前言 巡检脚本在网络运维中非常重要 近期
  • Jenkins远程命令执行漏洞(CVE-2018-1000861)

    声明 好好学习 天天向上 漏洞描述 Jenkins使用Stapler框架开发 其允许用户通过URL PATH来调用一次public方法 由于这个过程没有做限制 攻击者可以构造一些特殊的PATH来执行一些敏感的Java方法 通过这个漏洞 我们
  • C单元测试框架——CMockery (1) 简介

    cmockery 是google发布的用于C单元测试的一个轻量级的框架 主要特点 免费且开源 google提供技术支持 轻量级的框架 使测试更加快速简单 避免使用复杂的编译器特性 对老版本的编译器来讲 兼容性好 并不强制要求待测代码必须依赖
  • 【设计模式】-设计模式总目录

    设计模式 重要性不多说了 之前在简书上简单总结过 这次再来总结一次 更详细版 以此加深印象和帮助理解 01 单例模式 https blog csdn net lovexiaotaozi article details 83896573 02
  • Java并发编程——ReentrantLock重入锁解析

    重入锁 所谓重入锁 即支持重入性 表示能够对共享资源重复加锁 即当前线程获取该锁再次获取不会被阻塞 重入性 在线程获取锁的时候 如果已经获取锁的线程是当前线程的话则直接再次获取成功 由于锁会被获取n次 那么只有锁在被释放同样的n次之后 该锁
  • 二叉树的层序遍历,以及求层数

    二叉树的中序遍历 最主要的一种方法是用队列 Queue 来实现 下面贴出一份实现代码 class Tree int data Tree lchild 左孩子 Tree rchild 右孩子 以下是主要方法 public static voi
  • 自己实现telnet程序

    转自 http blog csdn net gujintong1110 article details 44278535 include