版权声明: 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. 《温故而知新》JAVA基础五

    定义:是类和类之间的关系"is a" 弗父类(基类)->子类(派生类) 是一直单继承的关系 好处:子类拥有父类的属性方法(private除外) 语法 class Son ex ...

  2. ios外包公司——技术分享:手机应用开发步骤

    1. 确定你的创意 您的创意是否有人做过,如果有类似的app,那就要多多考虑,争取超越并且有一些独特的优化设计在其中 2. 定位应用 通过苹果的人机界面指南(Human Interface Guide ...

  3. SSM Mybatis将新增数据写入数据库时出现的500状态码:Error updating database.的可能

    关于maven下ssm整合的项目推荐这篇博客:https://www.cnblogs.com/yiye/p/5969157.html 今日在ssm下的将新增数据写回数据库时遇到不少的问题,现作记录 如 ...

  4. vue+iview实现table和分页及与后台数据交互

    最近在项目中遇到使用table分页的功能,所以分享出来给大家希望能够对大家有帮助,话不多说直接上代码 <template> <div> <Table :columns=& ...

  5. 在1-10中选择一个数,输出x+xx+xxx+xxx....x之和,如:数字为2,则2+22=24

    代码: package bao; import java.util.Random; public class a { public static void main(String[] args) { ...

  6. js数组和数组去重的几种简单的方法

    http://blog.csdn.net/liangklfang/article/details/49300417 1.证明一个对象是数组的方法. 方法(1) [].constructor === A ...

  7. C# --- ??(空接合操作符)的一个案例

    Nullable<Int32> x = null; Nullable<Int32> y = null; Nullable<Int32> z = null; Int3 ...

  8. UGUI之导入图片之前自动设置图片打包的 tag

    之前一直在用的是NGUI,最近不知怎么突然兴趣来潮,想学习一下UGUI,毕竟,现在纵观Unity的市场,完全是UGUI的天下,NGUI已经渐渐退隐江湖,哈哈哈... 先来记录下,在图片资源导入到Uni ...

  9. spring aop 中的JoinPoint

    AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点 ...

  10. 使用blas做矩阵乘法

      #define min(x,y) (((x) < (y)) ? (x) : (y)) #include <stdio.h> #include <stdlib.h> # ...