+ -
当前位置:首页 → 问答吧 → (一个多进程的TCP 服务器)谁能详细讲解下?

(一个多进程的TCP 服务器)谁能详细讲解下?

时间:2010-12-16

来源:互联网

简介:一个多进程的TCP 服务器,sample中实现了daytime的功能

  1. #!/usr/bin/perl -w
  2. # tcp_socket_dt_srv.pl
  3. use strict;
  4. use Socket;
  5. use IO::Handle;
  6. use POSIX qw(WNOHANG);

  7. my $port     = $ARGV[0] || '3000';
  8. my $proto    = getprotobyname('tcp');

  9. $SIG{'CHLD'} = sub {
  10.      while((my $pid = waitpid(-1, WNOHANG)) >0) {
  11.           print "Reaped child $pid\n";
  12.       }
  13. };

  14. socket(SOCK, AF_INET, SOCK_STREAM, getprotobyname('tcp'))
  15.     or die "socket() failed: $!";
  16. setsockopt(SOCK,SOL_SOCKET,SO_REUSEADDR,1)
  17.     or die "Can't set SO_REUSADDR: $!" ;

  18. my $my_addr = sockaddr_in($port,INADDR_ANY);
  19. bind(SOCK,$my_addr)    or die "bind() failed: $!";
  20. listen(SOCK,SOMAXCONN) or die "listen() failed: $!";

  21. warn "Starting server on port $port...\n";

  22. while (1) {
  23.      next unless my $remote_addr = accept(SESSION,SOCK);
  24.      defined(my $pid=fork) or die "Can't fork: $!\n";
  25.    
  26.      if($pid==0) {
  27.           my ($port,$hisaddr) = sockaddr_in($remote_addr);
  28.           warn "Connection from [",inet_ntoa($hisaddr),",$port]\n";
  29.           SESSION->autoflush(1);
  30.           print SESSION (my $s = localtime);
  31.           warn "Connection from [",inet_ntoa($hisaddr),",$port] finished\n";
  32.           close SESSION;
  33.           exit 0;
  34.       }else {
  35.           print "Forking child $pid\n";
  36.       }
  37. }

  38. close SOCK;
复制代码

作者: ccc77   发布时间: 2010-12-16

(1)一个基础的socket程序,没太多讲的,自己看network programming with perl.
(2)这里fork并不是最好的方式,用IO::Select更佳。
(3)使用IO::Socket::INET更简洁易维护。

作者: 兰花仙子   发布时间: 2010-12-16

热门下载

更多