版权声明: 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并加入自己定义命令的更多相关文章
-
c++宏定义命令
在程序开始以#开头的命令,他们是预编译命令.有三类预编译命令:宏定义命令.文件包含命令.条件编译命令:今天聊聊宏定义: 宏定义命令将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替 ...
-
makefile详解 嵌套执行make,定义命令包
嵌套执行make 在一些大的工程中,我们会把我们不同模块或是不同功能的源文件放在不同的目录中,我们可以在每个目录中都书写一个该目录的Makefile,这有利于让我们的Makefile变得更加地简洁,而 ...
-
WPF自己定义命令Command
一.自己定义命令 自己定义命令必需要实现ICommand接口.例如以下代码所看到的: /// <summary> /// 自己定义的清除命令. 光脚丫思考 2014-7-31 06:51: ...
-
WPF使用RoutedCommand自己定义命令
主要代码例如以下所看到的: /// <summary> /// 声明并定义命令. /// </summary> RoutedCommand ClearCommand = new ...
-
C基础:关于预处理宏定义命令
为了程序的通用性,可以使用#define预处理宏定义命令,它的具体作用,就是方便程序段的定义和修改. 1.关于预定义替代 #define Conn(x,y) x##y#define ToChar(x) ...
-
ES6学习笔记(一)新的变量定义命令let和const
1.一些历史 ES6(ECMAScript 6.0)是 JavaScript 语言的新一代标准,于2015 年 6 月正式发布,距今已经4年了,它的目标,是使得 JavaScript 语言可以用来编写 ...
-
你好,Oh My Zsh - 社区力量全新方式定义命令行 | 咖啡时间
Oh My Zsh 是一款社区驱动的命令行工具,正如它的主页上说的,Oh My Zsh 是一种生活方式.它基于 zsh 命令行,提供了主题配置,插件机制,已经内置的便捷操作.给我们一种全新的方式使用命 ...
-
使用flags定义命令行参数
TensorFlow定义了tf.app.flags,用于支持接受命令行传递参数,其中tf.app.flags.DEFINE_xxx()是添加命令行的optional argument(可选参数),而t ...
-
查看gcc的默认宏定义命令【转】
转自:http://blog.csdn.net/cywosp/article/details/10730931 有些时候我们在编写代码或者阅读开源项目时经常会遇到一些陌生的宏定义,在找遍所有源代码都没 ...
随机推荐
-
分分钟搞定IOS远程消息推送
一.引言 IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://my.oschina.net/u/2340880/blog/405491这篇博客中有详细的介绍,这里主要讨论远 ...
-
http协议(二)请求和响应报文的构成
http协议用于客户端和服务器之间的通信,请求访问资源的一方称为客户端,而提供资源响应的一方称为服务器端. 下面就是客户端和服务端之间简单的通信过程 PS:请求必须从客户端建立通信,服务端没收到请求之 ...
-
python-根据左右值获取城市区域编码
def get_adcode(city): """ 根据城市获取区域编码 :param city: :return: """ db = db ...
-
网站地图sitemap.xml的格式
URL列表—XML格式及规范说明: 标签名称 属性 标签说明 标签类型 标签限制 可选/必选 urlset / urlset用来标记整个文档的开头 / / 必选 url / u ...
-
ios-点击屏幕,隐藏键盘
ios-点击屏幕,隐藏键盘 - (void)getFirstRegist{ //结束键盘编辑 __weak typeof(self)weakSelf = self; UITapGestureRecog ...
-
Amazon MWS 上传数据 (二) 构造请求
上一篇文章提到了Amazon 上传数据有三个步骤,但是每个步骤都需要构造服务和构造请求,服务是一样的,请求各不相同:这个很容易理解,这三个步骤都需要和Amazon服务器交互,所以他们的服务构造是一样的 ...
-
Redis监控数据分布工具Redis-audit 使用总结
Redis-audit 是一个用ruby实现的脚本,通过它,我们可以知道每一类 key 对内存的使用量.它可以提供的数据有:某一类 key 值的访问频率如何,有多少值设置了过期时间,某一类 key 值 ...
-
lpc1788IO口模拟IIC
#ifndef __MYIIC_H_ #define __MYIIC_H_ #include "common.h" #include "delay.h" #in ...
-
C#方法有关内容的总结--C#基础
1.静态方法与实例方法 using System;using System.Collections.Generic;using System.Linq;using System.Text;using ...
-
webconfig标签收集
在web项目启动时,很多因为vs没有报错,而页面跑不出来的情况,无法调试找到错误, 可以在webconfig中添加一个标签,运行项目就可以在页面显示错误 <customErrors mode=& ...