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で腐った卵を投げつけてください。

Source: https://habr.com/ru/post/J120170/


All Articles