ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 有关Telnet的几个编程问题

有关Telnet的几个编程问题

原创 Linux操作系统 作者:perltest 时间:2009-11-12 21:25:43 0 删除 编辑

首先说一下,在网上,又查到这篇文章:

http://www.gaoso.com/Article/safe/newss/newlou/shellbug/200502/25742.html

这是一个用Perl编写的Telnet服务端程序,程序注释很详细。不过这个程序不支持多用户同时登录。

目前通过多进程的编程方法解决了多用户同时登录,主要是用到了Perl的Fork功能,部分代码:

$SIG{CHLD}      = sub   {while(waitpid(-1,WNOHANG)>0){}};
$SIG{INT}       = sub   {$quit++};

my $i=1;

my $server_socket       =       IO::Socket::INET->new
(
        LocalPort       =>      23,
        Listen          =>      SOMAXCONN,
        Proto                   =>      'tcp',
        Reuse                   =>      1,
        Timeout         =>      60
) or die "ERROR!\n";

while(!$quit)
{
        next unless my $new_socket = $server_socket->accept;
        defined(my $child = fork()) or die "error!\n";
        if($child == 0)
        {
                print "fork ".$i."   ";
                $server_socket->close;
                work($new_socket);   # 转向用户数据处理

                exit 0;
        }

        $new_socket->close;
        $i++;
}
     

经过测试可以支持多用户同时登录,在用户退出登录后服务器不会留下defunct进程。

有关密码回显的问题,通过Telnet登录的时候,键入的密码应该是*或者不显示。

网上有一篇文章 http://group.gimoo.net/review/23011.html ,是说XP的Telnet有个Bug,服务端发送控制指令可以关掉客户端的字符回显功能,但再发指令无法开启字符回显了。

经过测试,XP确实无法重新开启字符回显,所以处理密码只能采用显示*的方法。

单字符模式是Telnet的基本模式,键入的每一个密码字符都会单独发送到服务端,目前从服务端采用这种方法实现*号显示:

print $new_socket "\x08*";

就是先把光标向前移一位,再用*覆盖用户键入的字符。

有关XP的Telnet字符显示位置的问题,这个好解决,只需要服务端程序指定坐标就可以了:

print $new_socket  "\x1b\x5bX;YH Hello world!";

这样就可以在客户端窗口的X;Y坐标位置上显示Hello world!

目前并没有打算在Telnet里重复实现HIS已有的功能,Telnet作为一个管理工具应该是比较理想的。

现在已经实现了通过Telnet运行SQl语句的程序,这样管理员在任何科室都可以方便地管理数据库。

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21129783/viewspace-619527/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2016-08-15

  • 博文量
    111
  • 访问量
    132263