#!/usr/bin/perl – Serwer TCP z użyciem forka

By | 3 czerwca 2013

Ponad rok temu zaprezentowałem sposób na wielowątkowy serwer TCP w perlu. Rozwiązanie to ma jeden plus – jest w pełni konfigurowalne, wszystko obsługujemy wg swoich wymagań. Ma zaś jedną zasadniczą wadę – długość kodu i ilość operacji do zaprogramowania zniechęca. Na szczęście na pomoc przychodzi nam moduł Net::Server.

Moduł Net::Server daje nam do pomocy kilka różnych dodatkowych modułów:

Moduł Net::Server dostępny jest z cpana (tutaj), bądź w repozytoriach cpan i/lub yum:

W tym poście zajmę się modułem Net::Server::Fork. Zanim przejdziesz do dalszego czytania postu, zapoznaj się z dokumentacją do Net::Server tak aby uzyskać informację o dostępnych możliwościach konfiguracji serwera:

lub na stronach man

1. Czym jest serwer TCP wykorzystujący forka?

Jest to serwer nasłuchujący na dowolnym, skonfigurowanym i wolnym porcie TCP. W momencie przychodzącego połączenia proces serwera forkuje się (tworzony jest drugi proces) i przejmuje połączenie i wykonuje się jako osobny proces nie zajmując procesu głównego.

2. Przykładowy serwer TCP

Zajmijmy się analizą kodu.

Pierwszym elementem który znajduje się w skrypcie to definicja użycia biblioteki Net::Server::Fork która – w odróżnieniu od użycia Net::Server – będzie każde przychodzące połączenie przyjmować i obsługiwać jako osobny proces.

Następnie tworzymy funkcję process_request() która jest wywoływana przez Net::Server::Fork podczas przychodzącego połączenia. To ona jest jakby osobnym procesem dla przychodzącego połączenia.

Następnie definiujemy nazwę procesu głównego – w jaki sposób ma ona się wyświetlać na liście procesów.

Ostatnim krokiem jest uruchomienie serwera poprzez wywołanie funkcji run() wraz z parametrami takimi jak: port na którym serwer ma nasłuchiwać, adres na którym ma nasłuchiwać, pid file, plik logu, poziom logowania, uruchomienie procesu w tle etc. W tym miejscu możemy skonfigurować instancję serwera dowolnie, wszystkie opcje są szczegółowo opisane na stronach manNet::Server (3pm) w sekcji „DEFAULT ARGUMENTS FOR Net::Server”.

Szczególną uwagę zwracam na możliwość konfiguracji procesu jako daemona. Wykorzystując kilka osobnych modułów (jak czytanie plików konfiguracyjnych etc.) możemy w bardzo łatwy sposób za pomocą modułu Net::Server stworzył własną aplikację typu Server.

Źródła modułu Net::Server zawierają gotowe przykłady serwera HTTP, UDP oraz komunikatora. Polecam zapoznanie się z przykładami aby zrozumieć wszystkie funkcje które dostarcza moduł Net::Server.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *