有关Telnet的几个编程问题

本文介绍了一个用Perl编写的Telnet服务端程序,该程序通过多进程编程方式支持多用户同时登录,并解决了密码回显及字符显示位置等问题。

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

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博客 ” ,链接:http://blog.itpub.net/21129783/viewspace-619527/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21129783/viewspace-619527/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值