版权声明: https://blog.csdn.net/cp1300/article/details/30541507

刚刚移植了一下uip的telnetd,还是比較简单方便的.

首先加入文件,注意usershell是自己写的.

在tcp.c中加入tcp端口监听程序

加入#include "telnetd.h"

void tcp_demo_appcall(void)
{
if(uip_conn->lport == HTONS(TCP_ClinetPort))
{
tcp_client_demo_appcall();
}
else if(uip_conn->lport == HTONS(80))
{
httpd_appcall();
}
else if(uip_conn->lport == HTONS(23))
{
telnetd_appcall();
}
}

在主函数中初始化

telnetd_init();

//自己定义shell

usershell.c

//用户自己定义shell
#include "shell.h"
#include "usershell.h"
#include <string.h>
#include "rtc.h" char printfbuff[64]; //获取时间
void SHELL_GetTime(char *pStr)
{
//RTC_Get(); //更新时间
sprintf(printfbuff, "%02d:%02d:%02d\r\n",timer.hour, timer.min, timer.sec);
shell_output("[获取时间成功]: ", printfbuff);
} //获取日期
void SHELL_GetDate(char *pStr)
{
//RTC_Get(); //更新时间
sprintf(printfbuff, "%04d-%02d-%02d\r\n",timer.w_year, timer.w_month, timer.w_date);
shell_output("[获取日期成功]: ", printfbuff);
}

usershell.h

#ifndef __USER_SHELL_H__
#define __USER_SHELL_H__ void SHELL_GetTime(char *pStr); //获取时间
void SHELL_GetDate(char *pStr); ////获取日期 #endif /* __USER_SHELL_H__ */

改动telnetd.h

#ifndef __TELNETD_H__
#define __TELNETD_H__ #include "uipopt.h" void telnetd_init(void);
void telnetd_appcall(void); #ifndef TELNETD_CONF_LINELEN
#define TELNETD_CONF_LINELEN 40
#endif
#ifndef TELNETD_CONF_NUMLINES
#define TELNETD_CONF_NUMLINES 16
#endif struct telnetd_state {
char *lines[TELNETD_CONF_NUMLINES];
char buf[TELNETD_CONF_LINELEN];
char bufptr;
u8_t numsent;
u8_t state;
}; //typedef struct telnetd_state uip_tcp_appstate_t; //#ifndef UIP_APPCALL
//#define UIP_APPCALL telnetd_appcall
//#endif #endif /* __TELNETD_H__ */

加入

void telnetd_init(void);

在shell.c中加入自己定义命令支持

static void
help(char *str)
{
shell_output("Available commands:", "");
shell_output("stats - show network statistics", "");
shell_output("conn - show TCP connections", "");
shell_output("help, ? - show help", "");
shell_output("exit - exit shell", "");
shell_output("time? - 获取当前系统时间", "");
shell_output("date?, - 获取当前系统日期", "");
}
/*---------------------------------------------------------------------------*/
static void
unknown(char *str)
{
if(strlen(str) > 0) {
shell_output("Unknown command: ", str);
}
}
/*---------------------------------------------------------------------------*/
static struct ptentry parsetab[] =
{{"stats", help},
{"conn", help},
{"help", help},
{"exit", shell_quit},
{"? ", help},
{"time?", SHELL_GetTime},
{"date? ", SHELL_GetDate}, /* Default action */
{NULL, unknown}};
/*---------------------------------------------------------------------------*/

加入命令显示

shell_output("time?    - 获取当前系统时间", "");
shell_output("date?, - 获取当前系统日期", "");

命令列表

{"time?", SHELL_GetTime},
{"date?", SHELL_GetDate},

运行之后的效果

uip移植telnetd并加入自己定义命令的更多相关文章

  1. c++宏定义命令

    在程序开始以#开头的命令,他们是预编译命令.有三类预编译命令:宏定义命令.文件包含命令.条件编译命令:今天聊聊宏定义: 宏定义命令将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替 ...

  2. makefile详解 嵌套执行make,定义命令包

    嵌套执行make 在一些大的工程中,我们会把我们不同模块或是不同功能的源文件放在不同的目录中,我们可以在每个目录中都书写一个该目录的Makefile,这有利于让我们的Makefile变得更加地简洁,而 ...

  3. WPF自己定义命令Command

    一.自己定义命令 自己定义命令必需要实现ICommand接口.例如以下代码所看到的: /// <summary> /// 自己定义的清除命令. 光脚丫思考 2014-7-31 06:51: ...

  4. WPF使用RoutedCommand自己定义命令

    主要代码例如以下所看到的: /// <summary> /// 声明并定义命令. /// </summary> RoutedCommand ClearCommand = new ...

  5. C基础:关于预处理宏定义命令

    为了程序的通用性,可以使用#define预处理宏定义命令,它的具体作用,就是方便程序段的定义和修改. 1.关于预定义替代 #define Conn(x,y) x##y#define ToChar(x) ...

  6. ES6学习笔记(一)新的变量定义命令let和const

    1.一些历史 ES6(ECMAScript 6.0)是 JavaScript 语言的新一代标准,于2015 年 6 月正式发布,距今已经4年了,它的目标,是使得 JavaScript 语言可以用来编写 ...

  7. 你好,Oh My Zsh - 社区力量全新方式定义命令行 | 咖啡时间

    Oh My Zsh 是一款社区驱动的命令行工具,正如它的主页上说的,Oh My Zsh 是一种生活方式.它基于 zsh 命令行,提供了主题配置,插件机制,已经内置的便捷操作.给我们一种全新的方式使用命 ...

  8. 使用flags定义命令行参数

    TensorFlow定义了tf.app.flags,用于支持接受命令行传递参数,其中tf.app.flags.DEFINE_xxx()是添加命令行的optional argument(可选参数),而t ...

  9. 查看gcc的默认宏定义命令【转】

    转自:http://blog.csdn.net/cywosp/article/details/10730931 有些时候我们在编写代码或者阅读开源项目时经常会遇到一些陌生的宏定义,在找遍所有源代码都没 ...

随机推荐

  1. 用docker-compose部署postgres+ postgis

    20190411更新.之前写的太啰嗦,也不删了,重新来.小坑还是有的 psql 命令行客户端 因为postgres用docker镜像安装,所以host不需要安装pg,只需要安装客户端 sudo apt ...

  2. 《Java程序设计》win10系统学前准备

    <Java程序设计>win10系统学前准备 Git的安装 在https://gitforwindows.org/中下载git for windows,下载完成后进行安装.当安装进行到这一步 ...

  3. [JSTL - fmt] fmt标签格式化日期

    <span ><fmt:formatDate value="${ann.adate }" pattern="yyyy-MM-dd"/>& ...

  4. Iris 语录

    Iris:hello,Loki first congratulatioins to you to upgrade to V2You really did a big progress in v0 an ...

  5. yii中的restful方式输出并调用接口和判断用户是否登录状态

    //创建一个控制器接口 返回的是restful方式 <?php namespace frontend\controllers; use frontend\models\Fenlei; use f ...

  6. 2015-10-13 jQuery5实例

    jQuery(5)   一.扑克牌切换 <body> <div class="ig ig1"><img src="image/1.jpg&q ...

  7. vmware 安装 centos7 记录笔记

    1, 安装centos 7, 到阿里云镜像下载centos 7 1.虚拟机的创建: 打开安装好的VMware (如果大家安装的VMware是英文版的也没关系,对号入座即可),选择“文件--->新 ...

  8. 使用js实现思维导图

    使用js实现思维导图 demo:http://rockyren.github.io/mindmaptree/ 源码:http://github.com/RockyRen/mindmaptree/tre ...

  9. 版本控制git第一篇

    一.git的下载与安装 参考:https://blog.51cto.com/wangfeng7399/2352524 Git 是一个开源的分布式版本控制软件,用以有效.高速的处理从很小到非常大的项目版 ...

  10. oracle数据库连接 ORA-12638:身份证明检索失败

    连数据库的时候突然报了一个这个 查找各种办法,发现自己从10g换成了11g,不过这个没有什么关系,跟oracle的安全设置有关系, 首先从开始菜单找到Net Manager 打开,选择本地,概要文件, ...