套接字的pty功能
pty functionality for socket
我正在编写linux守护进程,我想实现通过telnet配置其参数的能力。我有一个cli接口代码,它是使用带有历史和完成符的gnu readline库编写的,我想将该接口代码用于守护进程。
我尝试将stdin/stdout重定向到socket,将rl_instream/rl_outstream重定向到套接字,将读/写重定向到主/从pty,但没有成功。
这里提出了类似的问题,但没有任何答案。
也读了这个问题,但我没有孩子的过程。
我的问题是:
- 如何在单个流程中使用pty功能
- 如果我只有一个进程,我需要使用master和slave pty吗
代码示例(在pty设备上没有操作),预期结果-readline正常工作
char* readline_buff;
int main(void){
int mSock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
int socketfd, n, flag = 1;
int addrlen;
daemon(1,1);
setsockopt(mSock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int));
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(5000);
addr.sin_addr.s_addr = INADDR_ANY;
bind(mSock, (const sockaddr*)&addr, sizeof(addr));
listen(mSock,SOMAXCONN);
addrlen = sizeof(addrlen);
bzero(&addr, sizeof(addr));
int m_pty = posix_openpt(O_RDWR);
grantpt(m_pty);
unlockpt(m_pty);
string m_ptsname = ptsname(m_pty);
int slave = open(m_ptsname.c_str(), O_RDWR);
//
socketfd = accept(mSock, (struct sockaddr *) &addr, (socklen_t*)&addrlen);
//
close(STDOUT_FILENO);
dup2(socketfd, STDOUT_FILENO);
close(STDIN_FILENO);
dup2(socketfd, STDIN_FILENO);
close(STDERR_FILENO);
dup2(socketfd, STDERR_FILENO);
//
while(true){
readline_buff = readline("ME: ");
add_history(readline_buff);
free(readline_buff);
}
return 0;
}
非常感谢。
telnet协议基本上是一个基于线路的协议,因此它不容易处理单个按键或特殊代码。您可以要求连接的telnet客户端发送每一个密钥而不是行,这是通过telnet协商来完成的。
要了解更多信息,您应该阅读telnet RFC,最重要的是RFC 854和RFC 855。对于禁用客户端编辑,您还应该阅读RFC 1116。还可以查看维基百科页面,查看所有与telnet相关的RFC的列表。
简而言之,你必须向客户端发送一系列命令,要求它停止执行线路模式处理,并希望客户端回复它将停止执行。这不是简单的事情,实际上恰恰相反。要实现一个完整的telnet状态机,可以。即便如此,您也可能无法正确使用readline库,因为击键可能无法被识别为正确的向上/向下键,而且您可能无论如何都必须进行一些翻译。实际上,我建议您跳过正常的stdin/stdout处理和PTY处理,让客户端处理编辑,同时通过使用readline等外部库的功能或通过拥有内部历史队列来跟踪历史。
Pty。您需要通过在/etc/inputrc
或~/.inputrc
文件中添加以下行来为readline
配置新的历史密钥:
"e[A":history-search-backward
"e[B":history-search-forward
原因:
通常终端程序(读:telnet客户端)在用户按下向上或向下箭头键时发送转义码。
转义码为:
33[A - up arrow
33[B - down arrow
因为您的程序打印:^[[A^[[A^[[A^[[A
,所以它不会重新调整转义序列。所以你需要把这些转义序列告诉readline
。
查看更多信息
Readline提供了一个测试文件rlPtyTest.c,该文件通过PTY测试Readline。您可以将它用作实现套接字的模板。https://github.com/alexmac/alcextra/blob/master/readline-6.2/examples/rlptytest.c
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 询问在设计我的手臂模拟器功能表示格式1
- 功能原型的目的
- 套接字的pty功能