繁体   English   中英

使用连接到套接字的伪终端禁用回显

[英]Disable echo with pseudoterminal connected to socket

我正在编写一个与终端交互的 TCP 服务器应用程序。 它直接接受传入的 TCP 连接,然后在进程内处理所有 I/O。 一个要求是能够在必要时禁用 echo,没有什么特别的。

我最初试图直接在 TCP 套接字 fd 上调用tcgetattr ,但失败了,因为你不能在 sockets 上调用tcgetattrtcsetattr ,你必须在 TTY/PTY fds 上调用它们。 所以我创建了一个伪终端对并将它们插入中间。 master fd 中继到 TCP socket fd。

现在,可以禁用规范模式,但出于某种原因我无法禁用回声。

我有以下架构:

[Client] <--- TCP socket ---> [Server] socket fd <---> PTY master <---> PTY slave

这一切都在一个过程中。 我不像大多数 PTY 示例那样做forkpty类型的事情。 我只是启动另一个线程来处理 PTY 主机,它在 PTY 主机 FD 和套接字 FD 之间中继。 实际应用线程读写只使用slave FD。

我看到的所有将 PTY 置于“原始”模式(以禁用回显等)的示例都是在STDIN_FILENO上进行的,在我的例子中,它是套接字 fd 所在的位置(例如,Linux 编程接口,第 62 章-4):

if (ttySetRaw(STDIN_FILENO, &userTermios) == -1)
 errExit("ttySetRaw");

这些程序示例都假设程序是从终端启动的,但就我而言,因为我的程序.network 登录服务,它从头开始创建一个伪终端并直接中继到套接字:中间任何地方都没有“STDIN” ,这是一个多线程程序,因此使用 STDIN 是没有意义的。

tcsetattr成功用于term.c_lflag &= ~ECHO; 在从属 FD 上,但显然这似乎还不够。 由于您不能直接在套接字 FD 上进行终端操作,因此我如何在此处正确禁用 echo? 如果我调试在 PTY 主线程中中继的数据,我没有看到输入字符中继回套接字,但我仍然在终端上看到它们。 如果我尝试在主 FD 上调用tcsetattr ,这不仅不起作用,而且还会产生重新启用输入缓冲的效果,使问题变得更糟。 但这些是我唯一能接触到的 fds,所以我很困惑在这里还能尝试什么。

最终发现这是由于 Te.net 的本地回显,毕竟与伪终端无关。

这不能使用termios禁用,您必须发送 Te.net 转义序列才能这样做:

#include <arpa/telnet.h>

unsigned char echo_ctl[] = {IAC, WILL, TELOPT_ECHO}; 
write(fd, echo_ctl, 3);

来源: http://www.verycomputer.com/174_d636f401932e1db5_1.htm


同样,如果使用 .netcat 之类的工具进行测试,您需要执行类似stty -echo && nc 127.0.0.1 23的操作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM