免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7987 | 回复: 17
打印 上一主题 下一主题

用Perl如何实现高效稳定的Socket Server? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-18 19:09 |只看该作者 |倒序浏览
在运行一段时间后 进程就会死掉

#!/usr/bin/perl
use strict;
use IO::Socket;
my $server = IO::Socket::INET->new
(
        LocalPort =>2008,
        Type      =>SOCK_STREAM,
        Reuse     =>1,
        Listen    =>SOMAXCONN
)or die "Cound not create server!n";
my $client;
my $child_pid;
my $line;
while($client = $server->accept())
{
        unless (defined($child_pid=fork())) {die "Cound not create fork!n"};
        if($child_pid)
        {
                while($line=<$client>)
                {
                        print $line;
                }
        }else{
                while($line=<>)
                {
                        print $client $line;
                }
        }
}

论坛徽章:
0
2 [报告]
发表于 2005-11-18 19:15 |只看该作者
原帖由 duketang 于 2005-11-18 19:09 发表
在运行一段时间后 进程就会死掉

#!/usr/bin/perl
use strict;
use IO::Socket;
my $server = IO::Socket::INET->new
(
        LocalPort =>2008,
        Type      =>SOCK_STREAM,
         ...



while($client = $server->accept())
这里你这样写,不死掉才怪呢。

另外,要调用waitpid来回收child process。只创建,不回收,会对OS很不利的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2005-11-18 20:27 |只看该作者
Please use POE::Component::Server::TCP, it maybe a good choice for you.

  1. use POE;
  2. use POE::Component::Server::TCP;

  3. POE::Component::Server::TCP->new(
  4.     Port            => 9999,
  5.     ClientConnected => sub {
  6.                             $_[HEAP]->{client}->put( "Welcome!" );
  7.                         },
  8.     ClientInput     => sub {
  9.                             my $msg = $_[ARG0];
  10.                             $_[HEAP]->{client}->put( "Your said: $msg" );
  11.                         },
  12. );

  13. POE::Kernel->run();
复制代码


For more information, please visit http://poe.perl.org/

[ 本帖最后由 flw 于 2005-11-18 20:42 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2005-11-18 22:22 |只看该作者
对啊,有没有用perl写的比较成熟的成品啊。。。

论坛徽章:
0
5 [报告]
发表于 2005-11-19 18:18 |只看该作者
修改后 可以了
#!/usr/bin/perl
use strict;
use IO::Socket;
use POSIX 'WNOHANG';
use constant PORT => 2008;

my $quit        =       0;
$SIG{CHLD}      = sub   {while(waitpid(-1,WNOHANG)>0){}};
$SIG{INT}       = sub   {$quit++};
my $i=1;
my $server_socket       =       IO::Socket::INET->new
(
        LocalPort       =>      PORT,
        Listen          =>      SOMAXCONN,
        Proto                   =>      'tcp',
        Reuse                   =>      1,
        Timeout         =>      60
) or die "ERROR!n";
while(!$quit)
{
        next unless my $connection = $server_socket->accept;
        defined(my $child = fork()) or die "error!n";
        if($child == 0)
        {
                print "Line ".$i."   ";
                $server_socket->close;
                repeat_server($connection);
                exit 0;
        }

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

sub repeat_server
{
        my $sock = shift;
        while(my $line = <$sock>)
        {
                print $line;
        }
}

论坛徽章:
0
6 [报告]
发表于 2005-11-19 18:33 |只看该作者
项这样的 每秒钟最多能承受多少连接?

论坛徽章:
0
7 [报告]
发表于 2005-11-19 18:43 |只看该作者
原帖由 duketang 于 2005-11-19 18:33 发表
项这样的 每秒钟最多能承受多少连接?


做个压力测试不就知道了嘛,几百个连接没问题的。
当然,还得取决于你的主机配置。

论坛徽章:
0
8 [报告]
发表于 2005-11-19 18:48 |只看该作者
我现在最大只能达到八百多 实际环境中
如果在这段程序中实现对多个数据库发送query速度会慢多少?
数据库连接在前面初始化好 只在repeat_server中进行发送query的操作
没有检索 只是update delete ..等不需要数据返回的操作

论坛徽章:
0
9 [报告]
发表于 2005-11-19 20:01 |只看该作者
原帖由 duketang 于 2005-11-19 18:48 发表
我现在最大只能达到八百多 实际环境中
如果在这段程序中实现对多个数据库发送query速度会慢多少?
数据库连接在前面初始化好 只在repeat_server中进行发送query的操作
没有检索 只是update delete ..等不需要 ...


同时连接800多相当不错了,可别对perl socket期望太高。
数据库查询不是你的程序的性能瓶颈,如果数据库本身性能不错的话。

论坛徽章:
0
10 [报告]
发表于 2005-11-19 21:36 |只看该作者
原帖由 兰花仙子 于 2005-11-19 20:01 发表


同时连接800多相当不错了,可别对perl socket期望太高。


为什么这样说?
没希望了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP