Perl: wielowątkowy serwer TCP

By | 11 kwietnia 2011

Podczas projektowania pewnej aplikacji sieciowej zetknąłem się z pewnym problemem. A mianowicie: odpalamy sobie aplikację serwer nasłuchującym na pewnym porcie TCP i łączymy się do niej. Klient wysyła do serwera dane autoryzujące [mniejsza/większa czy zaszyfrowane ;-)]. Serwer następnie sprawdza poprawność danych i odsyła informacje o tym, czy się udało. Klient uradowany, że się udało, przesyła do serwera to co chciał przesłać i kończy połączenie. Wszystko fajnie, tylko w momencie jednego połączenia, drugi klient nie może się połączyć, ponieważ pierwszy jeszcze rozmawia z serwerem. Na pomoc przychodzą… wątki!

Tak, wątki pomagają w rozwiązaniu tego problemu.

Jak to działa?
No więc, pokrótce: skrypt otwiera najpierw gniazdo $server. Następnie w pętli przechwytujemy wszystkie połączenia i je akceptujemy z góry $server->accept() Następnie wyciągamy (tak informacyjnie) adres IP klienta który się do nas łączy ( $client->peerhost()). Jedyne, co nam pozostaje, to utworzenie wątku i przekazanie mu w parametrach zmiennej z socketem do połączenia i nazwą hosta, który się do nas łączy: $thr = Thread->new(\&get_connection, $client, $addr). Pragnę podkreślić, iż ten serwer nasłuchuje na porcie 2345: LocalPort => '2345'.

Kod jest bardzo banalny i nieskomplikowany. Czepialscy zauważą, że nie do końca kontroluję w ten sposób ilość wątków, akceptuję wszystkie połączenia itd. Suchy kod, dla tych z bujną wyobraźnią, co wiedzą co z nim zrobić 🙂

One thought on “Perl: wielowątkowy serwer TCP

Dodaj komentarz

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