Perlのマルチスレッドサーバーですか? 簡単!

簡単なTCPまたはUDPサーバーを作成することが必要になる場合があります。 たとえば、現在、私自身のDHCP実装は本番環境で非常にうまく機能しています(既存のDHCP実装は詳細のために適切ではありません)。 通常、これは単純に行われます-1サイクル、ソケットに耳を傾けます-そして出来上がり! しかし、「愚かな」アプローチは常に正当化されるとは限らず(たとえば、複数のストリームで作業するなど、より複雑なものが必要です)、重砲を使用するのは費用がかかりすぎます。







面白い? 猫へようこそ。



準備、または必要なもの



もちろん、まず、Perl自体が必要です。 多かれ少なかれモダンなバージョンで十分でしょう。 すぐに予約します-Windowsでこれを行う方法、わかりません。コードをチェックしませんでしたが、動作するはずです。

判明したように、 CPANにはそのようなタスクのための既製のNet :: Serverモジュールが既にあります 。 パッケージマネージャー(Debian / Ubuntuのlibnet-server-perl)または直接cpan(アマチュア用)のツールを使用してダウンロードしてインストールします。

cpan Net::Server
      
      





理論



Net ::サーバーは、マルチスレッドを操作するための複数のモデルを提供します。 シングル (1スレッド)、 Fork (各接続の新しい子プロセス)、 PreFork (類似、よりスマート)、 INET (inetdで使用)、 MultiType (いずれかのモデルの選択-構成からまたは自動的に)など。 私は個人的にPreForkが好きです(非常にシンプルで安定していますが、効果的です)。 実際には、MultiTypeを使用することをお勧めします。必要なモデルが利用できない場合、別のモデルにフォールバックできます。

このパッケージが提供するもの(モジュール、クラス、必要に応じて)はすべてベースです。 あなたはそれを継承し、いくつかの関数を再定義し(大丈夫、大丈夫、少なくとも1つ!)、設定を与え、それを実行する必要があります。 実際、必要なのは基本クラスだけです。 少し追加するだけです。 概要で説明されている基本バージョン(ただし、Perlの魔法がないわけではありません。たとえば、継承クラスを宣言しない継承)は、次のようになります。

 #!/usr/bin/perl use Net::Server::PreFork; @ISA = qw(Net::Server::PreFork); sub process_request { #...code... } __PACKAGE__->run();
      
      





動作します。 シンプル。 強く。 事実上。 そして、nifigaは明確ではありません(これは一般にプラスでもあります。誰かに見せることができます)。 実際には、これらすべてをより人間的な形にするでしょう。



練習する



プログラムの場合は、どこかでフォルダーを選択することをお勧めします。 3つのファイル(パッケージ、構成、および実行可能ファイル自体)があります。 さらに苦労せずに、コードは:

lib / Net / Server / Hello.pm

 #!/usr/bin/perl package Net::Server::Hello; #    use strict; #     ;) use warnings; use base qw(Net::Server::PreFork); #  sub process_request { # ,        my $self = shift; #    .  Perl - while (<STDIN>) { # Net::Server     STDIN + STDOUT! print "Hello!\n"; # .      . } } 1; # Perl-:    return
      
      





etc / myserver.cfg

 #  -   port 9999 proto tcp
      
      







bin / myserver.pl

 #!/usr/bin/perl use strict; use warnings; use FindBin; use lib "$FindBin::Bin/../lib"; #  :     bin, #   () -  lib,  .. use Net::Server::Hello; #    ; , ,      our $server = Net::Server::Hello->new(conf_file => "$FindBin::Bin/../etc/myserver.cfg"); $server->run(); # !
      
      





すべてを開始し、telnetで接続して何かを尋ねると、次のようなメッセージが表示されます。

$ telnet 127.0.0.1 9999

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

!

Hello!

Hi!

Hello!



Hello!

^]quit



telnet> quit

Connection closed.









次は?



ネットの使用::サーバーは、単純なネットワーク化された「Hello world」の作成やハブでの記事の作成に限定されるものではありません たとえば、RADIUSサーバーの実用的なプロトタイプが既にあり、それを自分のVPNサービスに使用する予定です(Kebrum、こんにちは!)。 また、CPANには、Net :: Serverが何らかの方法で使用するコード(たとえばHTTPサーバー)が大量にあります。 ドキュメントを読んでください-それは操縦します。 そして、力があなたと共に来ますように。



xkcdからの画像。

どちらかといえば、これが私の最初のhabratopikなので、habrahpostで腐った卵を投げつけてください。



All Articles