- 论坛徽章:
- 0
|
代码是作为 server的,目的是来自 $session 的client 输入交给 $pty 后,再从 $pty 读出发回给 client。
问题是:
输入普通的字符 client 端都能正常回显,但是如果输入功能键,如:
"<-"左箭头,抓包看到发送的是:1B 5B 44
但是,实际看到的 $pty 回送给 $session 的是:5E 5B 5B 44
试了多次后,看到的都是:
1B扔给 $pty 后,返回的是 5E
但 诸如四个方向键对应的keymap: 1B 5B 41/42/43/44,返回的都是 1B 5B 5B 41/42/43/44; 对 F1~ F4发送的是: 1b 5b 5b 41/42/43/44,但发送的是:1B 5B 5B 5B 41/42/43/44——这些功能键,5B都多了一个
这样子的话,client端,没法正常显示这些功能字符了,除非每次从 $pty 读到数据后,再做一次转化,但这很麻烦啊,因此每个字符都要处理,但字符对应的keymap长度又不固定,就实在不懂怎么处理了……
因为对 pty 才开始学习,只能猜测 pty 的字符编码就是如此规则的,但如果这样的话,如何和client端的字符编码进行转换了?请教各位了,或者推荐点参考资料也好啊,谢谢了~
next unless my $session = $sock->accept;
my $pty = new IO::Pty or die "can't make pty, $!";
defined( my $child = fork() ) or die "can't fork, $!";
if( $child ) {
defined( my $child_m = fork() ) or die "can't fork_m, $!";
if( $child_m ) {
my $buffer;
$| = 1;
while( sysread( $session, $buffer, 1 ) ) {
print $pty $buffer;
}
}else {
my $buffer_read_pty;
$| = 1;
while( sysread( $pty, $buffer_read_pty, 1 ) ) {
print "master got: " . ord( $buffer_read_pty ) . "\n";
print $session $buffer_read_pty;
}
exit(0);
}
close $session;
} else {
...
} |
|
|