我正在寻找一种我们可以坚持使用C / C ++守护进程的嵌入式shell。我们的想法是,我们可以telnet到正在收听的端口,并更改配置/视图状态等。
类似于Quagga / Zebra具有的CLI(在IOS上建模)或类似的东西。理想情况下,它具有易于使用的类似readline的支持,并且可以轻松扩展,以便我们为其添加新功能。
我已经考虑过使用嵌入式Python或Lua这样的东西来提供那种语言的shell,但我从来没有真正见过其他人这样做过。
其他人在介绍他们之前是如何完成这项工作的时候?
答案 0 :(得分:4)
libcli会做你想要的。它还具有身份验证,通过命令行工作,telnet,您可以轻松地构建客户端,但您也可以。非常喜欢自动完成,子命令等。你可以在这里找到它: https://github.com/dparrish/libcli
这是一个实现命令“hello”的小例子,让你在端口12345上telnet到它:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <libcli.h>
int call_hello(struct cli_def *cli, char *name, char **argv, int argc) {
cli_print(cli, "hello world");
return 0;
}
int main(void) {
struct cli_def *cli;
int sockfd;
int acceptfd;
struct sockaddr_in saddr, raddr;
unsigned int on = 1;
unsigned int rlen = sizeof(struct sockaddr_in);
cli = cli_init();
cli_register_command(cli, NULL, "hello", call_hello,
PRIVILEGE_UNPRIVILEGED, MODE_ANY, "runs hello world");
if((sockfd=socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(-1);
}
saddr.sin_port = htons(12345);
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = INADDR_ANY;
memset(&raddr, 0, sizeof(raddr));
raddr.sin_family=AF_INET;
if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0) {
perror("setsockopt");
exit(-1);
}
if(bind(sockfd, (struct sockaddr*)&saddr, sizeof(saddr)) == -1) {
perror("bind");
exit(-1);
}
if(listen(sockfd, 12) != 0) {
perror("listen");
exit(-1);
}
while((acceptfd=accept(sockfd, (struct sockaddr*)&raddr, &rlen)) > 0) {
while(cli_loop(cli, acceptfd) == 0);
}
return 0;
}
答案 1 :(得分:1)
如何添加本地HTTP服务器以便通过简单的Web客户端进行配置?网页非常灵活且易于使用;)例如,请参阅Poco的HTTPServer类(http://pocoproject.org/docs/)
答案 2 :(得分:0)
您正在寻找的是实现您自己的CMD.EXE(或终端仿真器),如实用程序,除了内置到您的GUI。我之前是如何完成这样的事情的?我已经阅读了VT100终端的手册以及如何模拟它。然后开始在.NET中实现相同的自定义组件