版权声明: 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. linux使用代理进行apt安装 以 nord 为例

    我的环境:(不必完全一样,只是提一下)----------- linux系统:kali 桌面:xface ----------------------------------------------- ...

  2. Codeforces 788 C. The Great Mixing

    题目链接:http://codeforces.com/contest/788/problem/C 一看就不能暴力$DP$,我们可以将浓度的合并操看作为在追逐一高度,每次操作前这个高度都会向上走$n$, ...

  3. Redis学习--key的通用操作、移库操作、订阅与事务、持久化和总结

    key的通用操作 keys pattern: pattern *表示任意一个多个字符 ?表示任意一个字符 del key1 key2 删除多个key exists keyname 查看是否存在 ren ...

  4. js 简版双色球 取号

    <style type="text/css"> span{ display: block; float: left; width: 50px; height: 50px ...

  5. js获取css样式封装

    封装 function getStyle(obj , attr){ return obj.currentStyle?obj.currentStyle[attr]:getComputedStyle(ob ...

  6. Spring中使用Redis

    普通使用Redis的方法很简单,前面的文章也有讲解,这篇文章主要就是讲解通过注解的方式实现Spring和Redis的整合.这里我们创建了3个类:1.Config 全局配置类,相当于xml配置文件2.R ...

  7. 使用pm2 管理node服务后台运行

    npm run dev的服务想放在服务器上,但是putty一断服务就没了. 网上差了下forever和pm2用的比较多,尤其是pm2 简直太好用了.. 具体操作如下 安装 npm install -g ...

  8. js各种特效轮播图,选项卡,放大镜,窗口拖拽,楼层跳转

    // 透明度轮播图 // img:轮播图片 // dot:轮播点 // lbtn:左箭头 // rbtn:右箭头 // banner:轮播盒子 // active:轮播点选中效果类名 // time: ...

  9. 3、简单了解Angular应用的启动过程

    首先,了解一下目录结构: 然后,简明扼要的说一下应用的启动过程: 1.首先找到main.ts(模块启动入口),main.ts去找到app中的根模块app.module.ts 2.根模块app.modu ...

  10. cout关闭输出缓冲,调试用

    cout.setf(std::ios::unitbuf);