首先说一下,在网上,又查到这篇文章:
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/
本文介绍了一个用Perl编写的Telnet服务端程序,该程序通过多进程编程方式支持多用户同时登录,并解决了密码回显及字符显示位置等问题。
8123

被折叠的 条评论
为什么被折叠?



