套接字的function

我正在写Linux守护进程,我想实现通过telnetconfiguration其参数的能力。 我有一个cli接口代码,使用历史和完成者使用gnu readline库编写,我想使用该接口代码守护进程。

我试图将stdin / stdoutredirect到套接字,将rl_instream / rl_outstreamredirect到套接字,读/写到master / slave pty,但没有成功。

类似的问题在这里没有任何答案。

也读过这个问题 ,但我没有孩子的过程。

我的问题是:

  1. 我如何在单个进程中使用ptyfunction?
  2. 如果我只有一个进程,是否需要使用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 RFC,最重要的是RFC 854和RFC 855 。 对于禁用客户端编辑,您还应该阅读RFC 1116 。 同时检查维基百科页面 ,查看所有与telnet相关的RFC列表。

总之,你必须发送一系列的命令给客户,要求它停止进行线路模式处理,并希望客户回答,它会停止这样做。 这不是简单的东西,实际上恰恰相反。 实现一个完整的telnet状态机可以。 即使这样,您可能也无法正确使用readline库,因为击键可能不会被识别为适当的上/下键,而且您可能还需要进行一些翻译。 实际上,我建议你跳过正常的stdin / stdout处理和PTY处理,让客户端在处理历史的时候处理编辑,或者通过使用像readline这样的外部库的功能,或者通过内部历史队列。

Pty是不需要的。 您需要通过/etc/inputrc添加到/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 ,它没有对转义序列进行regonise。 所以你需要把这些转义序列告诉readline

查看更多信息

Readline提供了一个测试文件rlPtyTest.c,通过PTY测试readline。 您可以将其用作实现套接字的模板。 https://github.com/alexmac/alcextra/blob/master/readline-6.2/examples/rlptytest.c