【发布时间】:2017-07-27 11:10:35
【问题描述】:
我正在学习如何编写基本 SSH 客户端的教程 http://api.libssh.org/master/libssh_tutor_shell.html。
我不希望在(本地)终端中回显 ENTER 键作为换行符。另外,我希望输入在准备好后立即被读取和发送,而不是在按下 ENTER 之后。
使用下面的代码,我尝试完成此操作。
然而,问题在于,在客户端中,每当按下一个键时,该字符会在下一次按键后首先显示。这种行为的原因可能是什么?
这个函数判断一个键是否被按下:
int kbhit()
{
struct timeval tv = {0L, 0L};
fd_set fds;
FD_ZERO(&fds);
FD_SET(0, &fds);
return select(1, &fds, NULL, NULL, &tv);
}
从/向服务器读取/发送数据:
struct termios term_attr;
struct termios old_attr;
tcgetattr(STDIN_FILENO, &old_attr);
cfmakeraw(&term_attr);
tcsetattr(STDIN_FILENO, TCSANOW, &term_attr);
while (ssh_channel_is_open(channel) && !ssh_channel_is_eof(channel))
{
nbytes = ssh_channel_read_nonblocking(channel, buff, sizeof(buff), 0);
if (nbytes < 0)
{
return SSH_ERROR;
}
if (nbytes > 0)
{
nwritten = write(1, buff, nbytes);
if (nwritten != nbytes)
{
return SSH_ERROR;
}
}
if (!kbhit)
{
usleep(5000L);
continue;
}
nbytes = read(0, buff, sizeof(buff));
if (nbytes < 0)
{
return SSH_ERROR;
}
if (nbytes > 0)
{
nwritten = ssh_channel_write(channel, buff, nbytes);
if (nwritten != nbytes)
{
return SSH_ERROR;
}
}
}
tcsetattr(STDIN_FILENO, TCSANOW, &old_attr);
【问题讨论】: