Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00056 008307 10493681 na godz. na dobę w sumie
Perl. Tworzenie aplikacji sieciowych - książka
Perl. Tworzenie aplikacji sieciowych - książka
Autor: Liczba stron: 840
Wydawca: Helion Język publikacji: polski
ISBN: 83-7197-604-6 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> perl - programowanie
Porównaj ceny (książka, ebook, audiobook).
Programowanie aplikacji sieciowych to jedna z tych dziedzin, z którą język Perl radzi sobie doskonale. Zwłaszcza, gdy czas nagli, a potrzebujemy napisać program spełniający funkcje serwera czy też klienta sieciowego, docenimy zalety Perla: zwięzłość kodu, dostęp do wielu wbudowanych procedur i setek modułów rozszerzających ten język oraz szybkość z jaką w Perlu tworzy się gotowe, działające aplikacje.

Książka poświęcona jest głównie protokołowi TCP/IP, będącemu fundamentem funkcjonowania Internetu. Omówiono w niej:

Autor książki, Lincoln Stein, to prawdziwy guru programowania sieciowego w Perlu. Wystarczy tylko wspomnieć, iż jest on autorem modułu CGI.pm, powszechnie używanego przy pisaniu skryptów CGI, a także autorem licznych książek na temat tego języka.
Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Perl. Tworzenie aplikacji sieciowych Autor: Lincoln D. Stein T³umaczenie: Robert Gêbarowski ISBN: 83-7197-604-6 Tytu³ orygina³u: Network Programming with Perl Format: B5, stron: 834 Przyk³ady na ftp: 76 kB Programowanie aplikacji sieciowych to jedna z tych dziedzin, z któr¹ jêzyk Perl radzi sobie doskonale. Zw³aszcza, gdy czas nagli, a potrzebujemy napisaæ program spe³niaj¹cy funkcje serwera czy te¿ klienta sieciowego, docenimy zalety Perla: zwiêz³oġæ kodu, dostêp do wielu wbudowanych procedur i setek modu³ów rozszerzaj¹cych ten jêzyk oraz szybkoġæ z jak¹ w Perlu tworzy siê gotowe, dzia³aj¹ce aplikacje. Ksi¹¿ka poġwiêcona jest g³ównie protoko³owi TCP/IP, bêd¹cemu fundamentem funkcjonowania Internetu. Omówiono w niej: • protokó³ TCP oraz interfejs programowania modu³u IO::Socket, • protokó³ SMTP i wysy³anie poczty elektronicznej z za³¹cznikami multimedialnymi, • protoko³y POP, IMAP i NNTP do odbioru i przetwarzania poczty elektronicznej, • protokó³ FTP, protokó³ HTTP i modu³ LWP do komunikacji z serwerami WWW, • serwery rozwidlaj¹ce siê oraz demony inetd systemów UNIX i Windows, • programowanie wielow¹tkowe w Perlu, • protokó³ UDP i serwery oparte na tym protokole, • komunikacjê miêdzy procesami za poġrednictwem gniazd domeny UNIX. Autor ksi¹¿ki, Lincoln Stein, to prawdziwy guru programowania sieciowego w Perlu. Wystarczy tylko wspomnieæ, i¿ jest on autorem modu³u CGI.pm, powszechnie u¿ywanego przy pisaniu skryptów CGI, a tak¿e autorem licznych ksi¹¿ek na temat tego jêzyka. IDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ SPIS TREĎCI SPIS TREĎCI KATALOG KSI¥¯EK KATALOG KSI¥¯EK KATALOG ONLINE KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK TWÓJ KOSZYK DODAJ DO KOSZYKA DODAJ DO KOSZYKA CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE ZAMÓW INFORMACJE O NOWOĎCIACH O NOWOĎCIACH ZAMÓW CENNIK ZAMÓW CENNIK CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl Spis treści Wstęp ...................................................z............................................ 9 Cześć I Podstawy...................................................d....................21 Rozdział 1. Podstawy operacji wejścia-wyjścia ...................................................z 23 Perl a praca w sieci...................................................s...................................................s......23 Praca w sieci w łatwym ujęciu ...................................................s.......................................26 Uchwyty plików ...................................................s...................................................s..........28 Składnia zorientowana obiektowo — wykorzystanie modułów IO::Handle i IO::File ....47 Rozdział 2. Procesy, potoki i sygnały ...................................................z.............. 55 Procesy ...................................................s...................................................s........................55 Potoki ...................................................s...................................................s..........................60 Sygnały...................................................s...................................................s........................70 Rozdział 3. Wprowadzenie do zagadnienia gniazd typu Berkeley.......................... 81 Klienty, serwery i protokoły...................................................s...........................................81 Gniazda typu Berkeley ...................................................s...................................................s85 Adresowanie gniazd ...................................................s...................................................s....91 Prosty klient sieciowy ...................................................s...................................................s.97 Nazwy i usługi sieciowe...................................................s.................................................99 Sieciowe narzędzia diagnostyczne ...................................................s...............................104 Rozdział 4. Protokół TCP ...................................................z.............................. 109 Klient usługi echo w protokole TCP ...................................................s............................109 Funkcje gniazda związane z wychodzącymi połączeniami ............................................112 Serwer usługi echo w protokole TCP...................................................s...........................113 Regulacja ustawień opcji gniazd ...................................................s..................................119 Inne funkcje odnoszące się do gniazd ...................................................s..........................123 Wyjątkowe sytuacje podczas komunikacji ...................................................s..................125 Rozdział 5. Interfejs programowania modułu IO::Socket .................................... 129 Użycie modułu IO::Socket ...................................................s...........................................129 Metody modułu IO::Socket...................................................s..........................................132 Więcej praktycznych przykładów ...................................................s................................139 Wydajność i styl ...................................................s...................................................s........145 Zagadnienie współbieżnych klientów ...................................................s..........................146 4 Perl. Tworzenie aplikacji sieciowych Część II Opracowywanie klientów dla typowych usług ................155 Rozdział 6. FTP i Telnet...................................................z................................ 157 Net::FTP ...................................................s...................................................s....................157 Net::Telnet...................................................s...................................................s.................171 Rozdział 7. SMTP: Wysyłanie poczty elektronicznej .......................................... 189 Wprowadzenie do modułów pocztowych ...................................................s....................189 Net::SMTP ...................................................s...................................................s................190 MailTools ...................................................s...................................................s..................196 MIME-Tools...................................................s...................................................s..............207 Rozdział 8. POP, IMAP i NNTP: Przetwarzanie poczty i grup dyskusyjnych ......... 233 Protokół pocztowy POP ...................................................s...............................................233 Protokół IMAP ...................................................s...................................................s..........250 Klienty aktualności sieciowych...................................................s....................................256 Brama aktualności-poczta ...................................................s............................................267 Rozdział 9. Klienty WWW ...................................................z............................. 277 Instalacja biblioteki LWP...................................................s.............................................278 Podstawy biblioteki LWP...................................................s.............................................279 Przykłady zastosowania LWP...................................................s......................................294 Analiza składniowa HTML i XML...................................................s..............................311 Część III Opracowywanie systemów klient-serwer TCP ................331 Rozdział 10. Serwery współbieżne oraz demon inetd ........................................... 333 Standardowe techniki współbieżności ...................................................s.........................333 Przykład przewodni: serwer-psychoterapeuta...................................................s..............336 Serwer-psychoterapeuta jako serwer współbieżny ...................................................s......337 Skrypt klienta dla serwera-psychoterapeuty ...................................................s................344 Kreowanie demonów w systemach UNIX ...................................................s...................347 Automatyczne uruchamianie serwerów sieciowych ...................................................s....354 Użycie superdemona inetd ...................................................s...........................................359 Rozdział 11. Aplikacje wielowątkowe...................................................z.............. 367 O wątkach słów kilka ...................................................s...................................................s367 Wielowątkowy serwer-psychoterapeuta ...................................................s......................375 Wielowątkowy klient ...................................................s...................................................s378 Rozdział 12. Aplikacje zmultipleksowane ...................................................z........ 381 Zmultipleksowany klient...................................................s..............................................382 Moduł IO::Select ...................................................s...................................................s.......384 Zmultipleksowany serwer-psychoterapeuta ...................................................s.................389 Rozdział 13. Nieblokujące operacje wejścia-wyjścia ........................................... 397 Tworzenie nieblokujących uchwytów wejścia-wyjścia ..................................................398 Stosowanie nieblokujących uchwytów ...................................................s........................400 Stosowanie nieblokujących uchwytów w operacjach wejścia-wyjścia zorientowanych wierszowo..........................................403 Uniwersalny moduł nieblokujący operacji wejścia-wyjścia ...........................................409 Nieblokujące funkcje connect i accept...................................................s.........................433 Spis treści 5 Rozdział 14. Ochrona serwerów ...................................................z...................... 449 Wykorzystanie dziennika zdarzeń systemowych ...................................................s.........450 Ustalanie przywilejów użytkownika ...................................................s............................466 Tryb skażenia ...................................................s...................................................s............472 Zastosowanie chroot() ...................................................s..................................................476 Obsługa HUP oraz pozostałych sygnałów ...................................................s...................478 Rozdział 15. Wieloprocesowość wyprzedzająca i wielowątkowość wyprzedzająca ... 489 Wieloprocesowość wyprzedzająca...................................................s...............................490 Wielowątkowość wyprzedzająca ...................................................s.................................521 Miary wydajności...................................................s...................................................s......531 Rozdział 16. IO::Poll ...................................................z....................................... 533 Użycie IO::Poll...................................................s...................................................s..........533 Zdarzenia IO::Poll ...................................................s...................................................s.....535 Metody IO::Poll...................................................s...................................................s.........537 Nieblokujący klient TCP — wykorzystanie IO::Poll...................................................s...538 Część IV Zagadnienia zaawansowane .........................................543 Rozdział 17. Protokół TCP z pilnymi danymi ...................................................z.... 545 Dane spoza pasma i wskaźnik pilności ...................................................s........................546 Stosowanie pilnych danych TCP...................................................s..................................548 Funkcja sockatmark()...................................................s...................................................s554 Serwer trawestujący ...................................................s...................................................s..557 Rozdział 18. Protokół UDP...................................................z.............................. 571 Klient usługi podawania daty i godziny...................................................s.......................571 Tworzenie i wykorzystywanie gniazd UDP...................................................s.................574 Błędy występujące przy korzystaniu z protokołu UDP ..................................................577 Zastosowanie IO::Socket do gniazd UDP...................................................s....................578 Komunikacja z wieloma hostami ...................................................s.................................580 Serwery UDP ...................................................s...................................................s............583 Zwiększanie niezawodności aplikacji UDP ...................................................s.................587 Rozdział 19. Serwery UDP ...................................................z.............................. 597 Internetowy system pogawędki...................................................s....................................597 Klient systemu pogawędki ...................................................s...........................................601 Serwer systemu pogawędki...................................................s..........................................611 Wykrywanie nieaktywnych klientów...................................................s...........................623 Rozdział 20. Rozgłaszanie...................................................z............................... 631 Przekaz do pojedynczego adresata a rozgłaszanie ...................................................s.......631 Tajniki rozgłaszania ...................................................s...................................................s..632 Wysyłanie i odbieranie przekazów ...................................................s..............................634 Rozgłaszanie bez adresu rozgłaszania...................................................s..........................638 Rozbudowa klienta pogawędki o funkcję odkrywania zasobów ....................................650 Rozdział 21. Rozsyłanie grupowe ...................................................z.................... 653 Podstawy rozsyłania grupowego...................................................s..................................653 Zastosowanie rozsyłania grupowego ...................................................s...........................660 Przykładowe aplikacje z wykorzystaniem rozsyłania grupowego ..................................668 6 Perl. Tworzenie aplikacji sieciowych Rozdział 22. Gniazda domeny UNIX ...................................................z................. 685 Zastosowanie gniazd domeny UNIX ...................................................s...........................685 Serwer formatujący tekst...................................................s..............................................691 Zastosowanie gniazd domeny UNIX dla datagramów...................................................s.695 Dodatki...................................................d.....................701 Dodatek A Dodatkowy kod źródłowy...................................................z............. 703 Moduł Net::NetmaskLite (rozdział 3.) ...................................................s.........................703 PromptUtil.pm (rozdziały 8. i 9.) ...................................................s.................................706 Moduł IO::LineBufferedSet (rozdział 13.)...................................................s...................709 Moduł IO::LineBufferedSessionData (rozdział 13.) ...................................................s....711 Moduł DaemonDebug (rozdział 14.) ...................................................s...........................717 Moduł Text::Travesty (rozdział 17.) ...................................................s............................718 Skrypt mchat_client.pl (rozdział 21.)...................................................s...........................722 Dodatek B Kody błędów i zmienne specjalne w Perlu ....................................... 727 Stałe opisujące błędy systemowe ...................................................s.................................727 Zmienne „magiczne” w operacjach wejścia-wyjścia ...................................................s...732 Pozostałe zmienne globalne Perla ...................................................s................................734 Dodatek C Internetowe tablice referencyjne ...................................................z. 737 Przypisane numery portów...................................................s...........................................737 Zarejestrowane numery portów...................................................s....................................762 Internetowe adresy rozsyłania grupowego ...................................................s...................780 Dodatek D Zasoby online ...................................................z............................. 783 Programowanie w języku Perl...................................................s......................................783 TCP/IP i gniazda typu Berkeley...................................................s...................................783 Projektowanie serwerów sieciowych ...................................................s...........................784 Protokoły warstwy aplikacji...................................................s.........................................784 Skorowidz...................................................z................................... 787 Rozdział 4. Protokół TCP W tym rozdziale przyjrzymy się niezwykle solidnemu, zorientowanemu na połączenie protokołowi sterowania transmisją strumienia bajtów TCP (ang. Transmission Con- trol Protocol). Jego właściwości sprawiają, że praca z gniazdami TCP przypomina pracę z uchwytami plików i potokami. Otwarcie gniazda TCP umożliwia przesłanie przez nie danych za pomocą funkcji RTKPV lub U[UYTKVG albo odczytanie danych przy użyciu operatora  czy funkcji TGCF lub U[UTGCF . Klient usługi echo w protokole TCP Zaczniemy od opracowania niewielkiego klienta TCP; będzie to zadanie znacznie bar- dziej skomplikowane od wszystkich zaprezentowanych w dotychczas omówionych przykładach. Na ogół klient jest odpowiedzialny za aktywne zainicjowanie swego połączenia ze zdalna usługą. Zarys tego procesu został już naszkicowany w rozdziale 3. I tak, gwoli przypomnienia, klient TCP musi podjąć naistępujące kroki: 1. Wywołaj funkcję UQEMGV , by utworzyć gniazdo. Z pomocą tej funkcji klient tworzy gniazdo typu strumieniowego (ang. a stream-type socket) w domenie +0 6 (Internet), używające protokółu TCP. 2. Wywołaj funkcję EQPPGEV , by połączenie:z równorzędnym zdalnym partnerem. Klient określa pożądany adres docelowy i łączy z nimi gniazdo za pomocą funkcji EQPPGEV . 3. Wykonaj operacje wejścia-wyjścia na gnieździe. Klient wywołuje rozmaite operacje wejścia i wyjścia, by komunikować się poprzeiz gniazdo. 4. Zamknij gniazdo. Po zakończeniu wszystkich operacji wejścia-wyjścia, klient może zamknąć gniazdo, używając funkcji ENQUG . Przedstawiony w tym podrozdziale przykład aplikacji to prosty klient usługi echo TCP. Usługa echo wykonywana standardowo na wielu hostach pracujących w systemie UNIX nie jest skomplikowana. Oczekuje na nadchodzące połączenie, przyjmuje je, a następ- nie powtarza każdy otrzymany bajt. Trwa to do momentu zamknięcia połączenia przez klienta. 110 Część I ♦ Podstawy Wypróbowanie przykładowego skryptu będzie wymagało skorzystania z serwera usługi echo. Można użyć na przykład serwera malenstwo.iinf.polsl.gliwice.pl. Wydruk 4.1 pokazuje zawartość skryptu tcp_echo_cli1.pl. Najpierw przyjrzyjmy się samemu kodowi skryptu. Wydruk 4.1. Klient usługi echo w protokole TCP WUTDKPRGTN RNKMVERAGEJQAENKRN W[EKGVERAGEJQAENKRN=JQUV?=RQTV? -NKGPVWUNWIKGEJQYGTULC6 2 WUGUVTKEV WUG5QEMGVSY  (#7.6ETNH  WUG+1*CPFNG O[ D[VGUAQWVD[VGUAKP    O[JQUVUJKHV^^ NQECNJQUV  O[RQTVUJKHV^^IGVUGTXD[PCOG GEJQ  VER  O[RTQVQEQNIGVRTQVQD[PCOG VER  JQUVKPGVACVQP JQUV QTFKGJQUVJQUVPKGPCP[ UQEMGV 51 -#(A+0 651 -A564 #/RTQVQEQN QTFKGHKCUMQUQEMGV  O[FGUVACFFTUQEMCFFTAKP RQTVJQUV  EQPPGEV 51 -FGUVACFFT QTFKGHKCUMQEQPPGEV  51 - CWVQHNWUJ   YJKNG O[OUIAQWV ]  EJQOROUIAQWV  OUIAQWV 4.(  RTKPV51 -OUIAQWV  O[OUIAKP51 -   RTKPVOUIAKP  D[VGUAQWV NGPIVJ OUIAQWV   D[VGUAKP NGPIVJ OUIAKP  _ ENQUG51 - RTKPV56 44DCLV[AY[UđCPGD[VGUAQWVDCLV[AQFGDTCPGD[VGUAKP P Wiersze 1 – 6: Ładuj moduły. Na tym etapie włączamy opcję ścisłego sprawdzania składni i ładujemy moduły 5QEMGV oraz +1*CPFNG. Modułu 5QEMGV używamy dla stałych związanych z gniazdem, zaś modułu +1*CPFNG z uwagi na dodawaną przez niego metodę CWVQHNWUJ . Wiersz 7: Zadeklaruj zmienne globalne. Teraz tworzymy dwie zmienne globalne do przechowywania rejestru liczby wysłanych i otrzymianych bajtów. Wiersze 8 – 9: Przetwarzaj argumenty wiersza poleceń. Z wiersza polecenia od- czytujemy nazwę docelowego hosta i numer docelowego portu. Jeśli host nie jest okre- ślony, przyjmujemy domyślnie nazwę lokalnego hosta, NQECNJQUV. Jeśli nie podano Rozdział 4. ♦ Protokół TCP 111 numeru portu, wykorzystujemy funkcję IGVUGTXD[PCOG , by sprawdzić numer portu dla usługi echo. Wiersze 10 – 11: Odszukaj numer protokołu i utwórz upakowany adres IP. Na tym etapie wykorzystujemy funkcję IGVRTQVQD[PCOG dla uzyskania numeru proto- kołu TCP, którego użyje funkcja UQEMGV . Następnie stosujemy KPGVACVQP do za- miany nazwy hosta do postaci upakowanego adresu IP, który można wykorzystać z funkcją UQEMCFFTAKP . Wiersz 12: Utwórz gniazdo. Wywołujemy teraz funkcję UQEMGV , by utworzyć uchwyt pliku gniazda o nazwie 51 - — podobnie jak w przykładzie z rozdziału 3. (wydruk 3.1). Przekazujemy argumenty określając rodzinę adresów internetowych #(A+0 6, strumieniowy typ gniazda strumieniowego 51 -A564 #/ i odszukany wcze- śniej numer protokołu TCP. Wiersz 13 – 14: Utwórz adres docelowy i połącz z nim gniazdo. Teraz wykorzystu- jemy funkcję UQEMCFFTAKP do utworzenia upakowanego adresu, zawierającego docelo- wy adres IP i numer portu. Jest on teraz adresem docelowym dla wywołania EQPPGEV . W razie powodzenia EQPPGEV zwraca wartość logiczną prawda. W przeciwnym przy- padku operacja zostaje zakończona wyświetleniem komuinikatu o błędzie. Wiersz 15: Włącz dla gniazda tryb automatycznego opróżniania. Chcemy, aby da- ne zapisane do gniazda zamiast zajmować miejsce w lokalnym buforze były z niego natychmiast usuwane. Wywołujemy zatem metodę gniazda CWVQHNWUJ , by włączyć tryb automatycznego opróżniania. Metoda automatycznego opróżniania jest dostępną dzięki modułowi +1*CPFNG. Wiersze 16 – 24: Główna pętla. Teraz rozpoczynamy małą pętlę. Przy każdym jej wykonaniu odczytujemy wiersz tekstu ze standardowego wejścia, a następnie wysy- łamy go do gniazda (51 -), przesyłając ów wiersz do zdalnego hosta. Następnie, uży- wając operatora  , odczytujemy wiersz odpowiedzi z serwera i drukujemy go na standardowe wyjście. Przy każdorazowym przejściu przez pętlę zliczamy liczbę wy- słanych i otrzymanych bajtów, aż do osiągnięcia znaku końca pliku ( 1() na standar- dowym wejściu. Wiersze 25 – 26: Zamknij gniazdo i podaj statystykę. Po zakończeniu pętli zamy- kamy gniazdo i drukujemy na standardowym urządzeniu wyjścia błędu naszą staty- stykę wysłanych i przyjętych bajtów. Sesja z użyciem skryptu tcp_echo_cli1.pl wygląda mniej więcej tak: VERAGEJQAENKRN [OCUUKúFQDTG2CPKG$QDTG! [OCUUKúFQDTG2CPKG$QDTG! 6WVCLUđ[EJCèGEJQ 6WVCLUđ[EJCèGEJQ ,QFKNGLKQQW ,QFKNGLKQQW @ DCLV[AY[UđCPGDCLV[AQFGDTCPG 112 Część I ♦ Podstawy Symbol @ w przedostatnim wierszu zapisu wskazuje na punkt, w którym znudziła mi się zabawa i nacisnąłem kombinację klawiszy powodującą zakończenie wprowadza- nia danych. W systemach Windows będzie to kombinacja iCtrl+Z (@ ). Funkcje gniazda związane z wychodzącymi połączeniami Teraz przyjrzymy się dokładniej funkcjom związanym z tworzeniem gniazd i ustana- wianiem wychodzących połączeń TCP. $boolean = socket(SOCKET,$domain,$type,$protocol) Dla danej nazwy uchwytu pliku (51 - 6), domeny (FQOCKP), typu V[RG) i protokołu (RTQVQEQN) metoda UQEMGV tworzy nowe gniazdo oraz kojarzy je z podaną nazwą uchwytu pliku. W razie powodzenia funkcja zwraca wartość logiczną prawda. W przypadku niepowodzenia UQEMGV zwraca zapis WPFGH i pozostawia komunikat o błędzie w . Domena, typ oraz protokół są ma- łymi liczbami całkowitymi. Odpowiednimi wartościami dla domeny i typu są stałe zdefiniowane w module 5QEMGV, natomiast wartość protokołu musi być określona poprzez wywołanie IGV RTQVQD[PCOG w czasie wykonywania. Typowy wzorzec do tworzenia gwniazd TCP wygląda tak: UQEMGV 51 -#(A+0 651 -A564 #/UECNCTIGVRTQVQD[PCOG VER Funkcja IGVRTQVQD[PCOG została tu umieszczona w kontekście skalarnym, tak, by zwróciła pojedynczy wynik określający numer protokołu. $boolean = connect(SOCK,$dest_addr) Funkcja EQPPGEV próbuje połączyć gniazdo zorientowane na połączenie ze wskazanym adresem docelowym. Gniazdo musiało być uprzednio utworzone za pomocą funkcji UQEMGV , a upako- wany adres docelowy za pomocą UQEMCFFTAKP lub funkcji jej równoważnej. System automa- tycznie wybiera port, który będzie wykorzystany jako lokalny adres dla gniazda. W przypadku powodzenia funkcja EQPPGEV zwraca wartość logiczną prawda; w przeciwnym przypadku EQP PGEV zwraca wartość logiczną fałsz, zaś zmienna  zostaje ustawiona na kod błędu syste- mu, wyjaśniający zaistniały problem. Nie można wywoływać EQPPGEV dla gniazda zoriento- wanego na połączenie więcej niż raz. Próba powtórnego wywołania tej funkcji spowoduje wystąpienie błędu +5 100 („Punkt końcowy transportu jest już połączony”). $boolean = close (SOCK) Funkcja ENQUG współpracuje z gniazdami na tej samej zasadzie, jak w przypadku zwykłych uchwytów plików. Po jej wywołaniu gniazdo zostaje zamknięte dla petentów. Raz zamknięte nie może być dłużej używane do dokonywania weń zapisów czy odczytywania z niego danych. W przypadku powodzenia funkcja ENQUG zwraca wartość logiczną prawda, w przeciwnym ra- zie zwraca wpis WPFGH i pozostawia komunikat o błędzie w zmiennej . Wpływ funkcji ENQUG na przeciwległy koniec połączenia można porównać z zamykaniem potoku. Po zamknięciu gniazda wszystkie dokonywane z niego odczyty będą na przeciwległym końcu połączenia zwracać symbol końca pliku ( 1(). Jakiekolwiek zapisy do gniazda spowodują wyjątek 2+2 . Rozdział 4. ♦ Protokół TCP 113 $boolean = shutdown (SOCK,$how) Funkcja UJWVFQYP jest bardziej precyzyjną odmianą funkcji ENQUG , pozwalającą użytkowni- kowi na podjęcie decyzji, którą część dwukierunkowego połączenia należy zamknąć. Pierwszy argument tej funkcji to podłączone gniazdo. Argument drugi — JQY — jest małą liczbą cał- kowitą, wskazującą, na którym końcu ma nastąpić zamknięcie połączenia. W tabeli 4.1 ze- brane zostały wartości przyjmowane przez argument JQY. Argument o wartości 0 zamyka gniazdo dla mających nastąpić odczytów, wartość 1 powoduje zamknięcie gniazda dla zapi- sów, 2 zaś zamyka gniazdo zarówno dla odczytów, jak i dla zapisów (podobnie jak dzieje się to w przypadku funkcji ENQUG ). Zwrócenie wartości niezerowej wskazuje na powodzenie funkcji UJWVFQYP . Tabela 4.1. Wartości funkcji shutdown() Wartość HOW Opis    zamyka gniazdo dla odczytu zamyka gniazdo dla zapisu całkowicie zamyka gniazdo Oprócz zdolności do połowicznego zamykania gniazda, funkcja UJWVFQYP ma jeszcze jedną przewagę nad ENQUG . Jeśli proces wywołał na jakimś etapie funkcję HQTM , w procesach potomnych mogą istnieć kopie uchwytu pliku gniazda. Próba zwykłego zamknięcia za pomocą ENQUG jakiejś kopii gniazda w rzeczywistości nie zamknie samego gniazda aż do momentu, gdy zamknięte zostaną wszystkie jego kopie (zacho- wanie to dotyczy również uchwytów plików). W wyniku tego klient na przeciwległym końcu połączenia nie otrzyma informacji 1(, dopóki proces macierzysty i proces (lub procesy) potomny nie zamkną swoich kopii. W odróżnieniu od ENQUG , funkcja UJWV FQYP zamyka wszystkie kopie gniazda, wysyłając natychmiast znak 1(. Skorzy- stamy z tej zalety UJWVFQYP w tej książce kilkakrotnie. Serwer usługi echo w protokole TCP Przyjrzymy się teraz prostemu serwerowi TCP. W przeciwieństwie do klienta TCP, serwer zazwyczaj nie wywołuje funkcji EQPPGEV . Zamiast tego serwer TCP podąża za następującymi wytycznymi: 1. Utwórz gniazdo. To etap identyczny z odpowiednim etapem tworzeniai klienta usługi echo (wiersz 12). 2. Powiąż gniazdo z lokalnym adresem. Program klienta może pozwolić systemowi operacyjnemu na wybranie adresu IP i numeiru portu do wykorzystania przy wywołaniu funkcji EQPPGEV ; adres serwera musi być jednak bardzo dobrze znany. Z tego powodu serwer musi wyraźnie powiiązać gniazdo z lokalnym adresem IP i numerem portu. Jest to proces znany jako powiązanie (ang. binding). Funkcja towarzysząca temu procesowi to DKPF . 3. Oznacz gniazdo jako nasłuchujące. Serwer wywołuje funkcję NKUVGP , by poinformować system operacyjny, że gniazdo będzie iwykorzystane do przyjmowania nadchodzących połączeń. Funkcja ta okrieśla też liczbę 114 Część I ♦ Podstawy nadchodzących połączeń, które mogą oczekiwać w kolejcei, zanim zostaną przyjęte przez serwer. Gniazdo, które zostało oznaczone jako gotowe do przyijmowania nadchodzących połączeń jest nazywane gniazdem nasłuchu (ang. listening socket). 4. Przyjmij nadchodzące połączenia. Serwer wywołuje teraz — zazwyczaj w pętli — funkcję CEEGRV . Przy każdym wywołaniu funkcja ta oczekuje na nadchodzące połączenie, a potem zwraca nowe, podłączone gniazdo, które jest przyłączone do gniazda równorzędnego, zdalnego piartnera (rysunek 4.1). Operacja ta nie ma żadnego wpływu na gniazdo nasłuchu. Rysunek 4.1. Odbierając nadchodzące połączenie, funkcja accept() zwraca nowe gniazdo połączone z klientem 5. Wykonaj operacje wejścia-wyjścia na podłączonym gniueździe. Serwer wykorzystuje podłączone gniazdo do komunikacji z róiwnorzędnym, zdalnym partnerem (ang. peer). Po zakończonej pracy serwer zamyka podłączone gniazido. 6. Przyjmij więcej połączeń. Wykorzystując gniazdo nasłuchu serwer może przyjąć (za pomocą funkcji CEEGRV ) dowolną liczbę połączeń. Po ich zakończeniu serwer zamknie — wykorzystując funkcję ENQUG — gniazdo nasłuchu i zakończy pracę. Nasz przykładowy serwer nosi nazwę tcp_echo_serv1.pl. Jest to nieco wypaczona wer- sja standardowego serwera usługi echo. Powtarza to wszystko, co zostało do niego wy- słane, ale zamiast odesłać dane w pierwotnej formie, powtarza każdy wiersz wspak, zachowując bez zmian tylko znak nowego wiersza. Jeśli zatem zostanie przesłane do serwera pozdrowienie „Hello world!”, odesłane echo będzie następujące: „!dlrow olleH” (nie ma żadnych powodów dla takiego przetwarzania informacji, poza chęcią nie- znacznego ubarwienia tego trochę nudnego przykładu). Serwer ten może być użyty przez klienta z wydruku 4.1 lub wraz ze standardowym programem Telnet. Wydruk 4.2 pokazuje kod serwera. Wydruk 4.2. Skrypt tcp_echo_serv1.pl dostarcza sieciową usługę echa wł protokole TCP WUTDKPRGTN RNKMVERAGEJQAUGTXRN W[EKGVERAGEJQAUGTXRN=RQTV? WUGUVTKEV WUG5QEMGV WUG+1*CPFNG WUGEQPUVCPV/;A *1A2146  Rozdział 4. ♦ Protokół TCP 115 O[ D[VGUAQWVD[VGUAKP    O[RQTVUJKHV^^/;A *1A2146 O[RTQVQEQNIGVRTQVQD[PCOG VER  5+)] +06 _UWD] RTKPV56 44DCLV[AY[UđCPGD[VGUAQWVDCLV[AQFGDTCPGD[VGUAKP P GZKV _ UQEMGV 51 -#(A+0 651 -A564 #/RTQVQEQN QTFKGHKCUMQUQEMGV  UGVUQEMQRV 51 -51.A51 - 651A4 75 # 4 QTFKG0KGOQľPCWUVCYKè K51A4 75# 4 O[O[ACFFTUQEMCFFTAKP RQTV+0# 4A#0;  DKPF 51 -O[ACFFT QTFKGHKCUMQDKPF  NKUVGP 51 -51/#: 100 QTFKGHKCUMQNKUVGP  YCTPEGMCOPCRQđæEGPKCPCFEJQFæEGFQRQTVWRQTV PK YJKNG  ] PGZVWPNGUUO[TGOQVGACFFTCEEGRV 5 55+1051 -  O[ RQTVJKUCFFT UQEMCFFTAKP TGOQVGACFFT  YCTP2QđæEGPKG=KPGVAPVQC JKUCFFT RQTV? P 5 55+10 CWVQHNWUJ   YJKNG 5 55+10 ] D[VGUAKP NGPIVJ A  EJQOR O[OUIAQWV UECNCTTGXGTUGA  P RTKPV5 55+10OUIAQWV D[VGUAQWV NGPIVJ OUIAQWV  _ YCTP2QđæEGPKG=KPGVAPVQC JKUCFFT RQTV?CMQēEQKPQ P ENQUG5 55+10 _ ENQUG51 - Wiersz 1 – 9: Ładuj moduły, inicjalizuj stałe i zmienne. Rozpoczynamy — podob- nie jak w usłudze dla klienta — od wprowadzenia modułów 5QEMGV i +1*CPFNG. Okre- ślamy dla echa prywatny port o numerze 2007; nie będzie on pozostawał w konflikcie z żadnym istniejącym portem dla serwera usługi echo. Ustalamy — w znany już spo- sób — zmienne RQTV i RTQVQEQN (wiersze 1 – 8) i inicjalizujemy liczniki. Wiersze 10 – 13: Zainstaluj procedurę obsługi przerwania +06. Musi istnieć spo- sób na przerwanie pracy serwera; z tego powodu należy zainstalować procedurę ob- sługi dla sygnału przerwania +06, wysyłanego z terminala, na którym użytkownik wciśnie kombinację klawiszy CTRL+C. Procedura obsługi sygnału +06 drukuje ze- braną statystykę zliczeń bajtów i na tym kończy dziaiłanie. Wiersz 14: Utwórz gniazdo. Wykorzystując argumenty analogiczne do tych, jakie zastosowano w usłudze dla klienta (wydruk 4.1), wywołujemy funkcję UQEMGV , by utworzyć gniazdo strumieniowe TCP. 116 Część I ♦ Podstawy Wiersz 15: Ustaw opcję gniazda 51A4 75 # 4. Kolejnym krokiem jest wywołanie UGVUQEMQRV w celu ustawienia wartości logicznej prawda dla opcji 51A4 75 # 4 gniazda. Dzięki tej opcji możliwe jest natychmiastowe wstrzymanie pracy i ponowne natychmiastowe uruchomienie serwera. Gdyby tej opcji nie ustawiono, to w pewnych warunkach system mógłby nie zezwolić na ponowne powiązanie serwera z adresem lokalnym aż do chwili, kiedy stare połączenia dobiegłiyby końca. Wiersze 16 – 17: Powiąż gniazdo z adresem lokalnym. Wywołanie DKPF przypisuje adres lokalny do gniazda. Adres ten jest tworzony przy użyciu funkcji UQEMCFFTAKP , której zostaje przekazany jako port numer prywatnego portu dla echa i parametr +0# 4A #0; jako adres IP. +0# 4A#0; działa jako symbol wieloznaczny (ang. wildcard). Umoż- liwia to systemowi operacyjnemu przyjmowanie połączeń na każdym z adresów IP hosta, z adresem pętli zwrotnej i każdej sieciowej kiarty interfejsowej hosta włącznie. Wiersz 18: Wywołaj funkcję NKUVGP , by przygotować gniazdo na przyjęcie nad- chodzących połączeń. Wywołanie funkcji NKUVGP informuje system operacyjny, że gniazdo będzie wykorzystywane do przyjmowania nadchodzących połączeń. Funkcja ta przyjmuje dwa argumenty. Pierwszym jest gniazdo, drugim — liczba całkowita wska- zująca maksymalną liczbę nadchodzących połączeń, jakie mogą oczekiwać w kolejce na przetworzenie. Często zdarzają się próby niemal jednoczesnego połączenia z gniaz- dem ze strony rozmaitych klientów; w takim przypadku drugi argument określa, jak duże mogą być zaległości w przyjmowaniu czekających na przetworzenie połączeń. W naszym przykładzie ustalamy tę wartość na maksymalną dopuszczalną przez sys- tem liczbę oczekujących połączeń, która jest określona za pomocą stałej 51/#: 100. Stała ta jest zdefiniowana w module 5QEMGV. Wiersze 19 – 34: Główna pętla. Większość kodu zajmuje główna pętla serwera, w której serwer oczekuje na nadchodzące połączenia; w niej także wykonywana jest ich obsługa. Wiersz 21: Akceptuj nadchodzące połączenie. Każde wykonanie pętli wiąże się z wywołaniem funkcji CEEGRV , wykorzystującej gniazdo nasłuchu jako swój drugi argument, nazwę nowego gniazda (5 55+10) zaś jako argument pierwszy (właśnie ta- ka, choć może wydawać się to dziwne, jest prawidłowa kolejność argumentów). Jeśli wywołanie funkcji CEEGRV kończy się powodzeniem, funkcja zwraca jako wynik upakowany adres zdalnego gniazda, zaś za pośrednictwem argumentu 5 55+10 zostaje zwrócone podłączone gniazdo. Wiersze 22 – 23: Rozpakuj adres klienta. Wywołujemy UQEMCFFTAKP w kontekście listowym, by rozpakować zwrócony przez funkcję CEEGRV adres klienta. Składniki adresu otrzymane po rozpakowaniu to port klienta i adres IP. Adres drukujemy na stan- dardowym wyjściu błędu. W rzeczywistej aplikacji taka informacja mogłaby być za- pisana w elektronicznie datowanym pliku rejestru zdarzeń (ang. time-stamped log file). Wiersze 24 – 33: Obsłuż połączenie. Ten fragment kodu obsługuje komunikację z klientem wykorzystującym podłączone gniazdo. Najpierw umieszczamy gniazdo 5 55+10 w trybie automatycznego opróżniania, aby zapobiec kłopotom związanym z buforowaniem. Teraz można odczytywać za każdym razem po jednym wierszu z gniaz- da, używając operatora  , lub zapisać tekst w wierszu na wspak i odsyłać go do klien- ta, wykorzystując funkcję RTKPV . Trwa to do momentu, aż 5 55+10 zwróci wpis Rozdział 4. ♦ Protokół TCP 117 WPFGH, co będzie znaczyło, że równorzędny zdalny parter zamknął połączenie po swojej stronie. Zamykamy gniazdo 5 55+10, drukujemy komunikat o stanie i wraca- my do funkcji CEEGRV w oczekiwaniu na kolejne nadchodzące połączenie. Wiersz 35: Uporządkuj. Po zakończeniu głównej pętli „porządkujemy” system, za- mykając otwarte gniazdo nasłuchu. Ta część kodu nigdy jednak nie następuje, gdyż serwer jest zaprojektowany tak, by jego pracę kończyił klawisz przerwania. Nasz przykładowy serwer uruchomiony z wiersza poleceń drukuje komunikat EGMCO PC RQđæEGPKC PCFEJQFæEG FQ RQTVW, a potem wstrzymuje działanie do chwili, gdy uzyska jakieś połączenie. W sesji, której zapis teraz przedstawimy, widać dwa połą- czenia — jedno od klienta lokalnego spod adresu 127.0.0.1 na pętli zwrotnej, drugie zaś od klienta z adresem 192.168.3.2. Przerwanie pracy serwera pozwoli na zapozna- nie się ze statystyką, wydrukowaną przez procedurę iobsługi przerwania +06. VERAGEJQAUGTXARN EGMCOPCRQNCEGPKCPCFEJQFCEGFQRQTVW 2QđæEGPKG=? 2QđæEGPKG=?CMQēEQPQ 2QđæEGPKG=? 2QđæEGPKG=?CMQēEQPQ @ DCLV[AY[UđCPGDCLV[AQFGDTCPG Procedura obsługi +06 użyta w tym serwerze sprzeciwia się zaleceniom z rozdziału 2., mówiącym o tym, że procedury obsługi sygnałów nie obsługują żadnych operacji wejścia-wyjścia. Ponadto wywołanie funkcji GZKV z wnętrza procedury obsługi nie- sie ryzyko powstania wyjątku krytycznego w trakcie zamykania systemu w kompute- rach z systemem operacyjnym Windows. Bezpieczniejszy sposób zamykania serwera poznamy w rozdziale 10. Funkcje gniazda związane z połączeniami nadchodzącymi Trzy kolejne, niezbędne funkcje są związane z obsługą nadchodzących połączeń w serwerach. $boolean = bind(SOCK,$my_addr) Funkcja DKPF wiąże adres lokalny z gniazdem, zwracając — w przypadku powodzenia — war- tość logiczną prawda lub fałsz w razie niepowodzenia. Gniazdo musi być uprzednio utwworzone za pomocą funkcji UQEMGV , a upakowany adres wygenerowany za pomocą UQEMCFFTAKP lub funkcji jej równoważnej. W części adresu określającej port można umieścić numer jednego z por- tów nieużywanych w systemie. Adres IP może być adresem jednego z interfejsów sieciowych hosta, adresem pętli zwrotnej albo symbolem wieloznacznym — +0# 4A #0;. W systemach UNIX do powiązania z zarezerwowanymi portami o numerach niższych niż 1024 wymagane są przywileje superużytkownika (użytkownika root). Próba dokonania powiązania bez takich przywilejów spowoduje zwrócenie wartości WPFGH i ustawienie  w pozycji błędu # 5 (2GT OKUUKQP FGPKGF — „Brak pozwolenia”). Funkcja DKPF jest zazwyczaj wywoływana w serwerach w celu powiązania nowo utworzonego gniazda z dobrze znanym portem, jednak klient może wywołać tę funkcję także wtedy, gdy ma zamiar określić lokalny port i (lub) interfejs sieciowy. 118 Część I ♦ Podstawy $boolean = listen(SOCK,$max_queue) Funkcja NKUVGP informuje system operacyjny, że gniazdo będzie użyte do przyjmowania nad- chodzących połączeń. Dwoma jej argumentami są uchwyt pliku gniazda, które musiało być uprzednio utworzone przy funkcji użyciu UQEMGV , oraz wartość całkowita, wskazująca na licz- bę nadchodzących połączeń, które mogą oczekiwać w kolejce do przetworzenia. Maksymalna długość kolejki jest zależna od systemu. Określenie wartości większej niż akceptowana przez dany system spowoduje, że funkcja NKUVGP automatycznie zredukuje zawyżoną wartość do dopuszczalnej dla systemu wartości maksymalnej. Moduł 5QEMGV eksportuje stałą 51/#: 100 dla określenia tej maksymalnej wartości. W przypadku powodzenia funkcja NKUVGP zwraca wartość logiczną prawda i oznacza gniazdo jako nasłuchujące. W przeciwnym razie zwraca wpis WPFGH i ustawia  na odpowiednią wartość błędu. $remote_addr = accept(CONNECTED_SOCKET,LISTEN_SOCKET) Jeśli gniazdo jest oznaczone jako nasłuchujące, należy wywołać funkcję CEEGRV do przyjmo- wania nadchodzących połączeń. Funkcja ta przyjmuje dwa argumenty: 100 6 A51 - 6 — nazwę uchwytu pliku przeznaczonego dla nowo podłączonego gniazda i .+56 0A51 - 6 — na- zwę gniazda nasłuchu. W przypadku powodzenia jako wynik funkcji zostanie zwrócony upa- kowany adres zdalnego hosta, a argument 100 6 A51 - 6 zostanie skojarzony z nadcho- dzącym połączeniem. Po wykonaniu funkcji CEEGRV do komunikacji z równorzędnym zdalnym klientem będzie użyty uchwyt 100 6 A51 - 6. Nie ma potrzeby tworzenia tego uchwytu „na zapas”. Jeśli wydaje się to Czytelnikowi trochę niejasne, niech wyobrazi sobie funkcję CE EGRV jako specjalną odmianę funkcji QRGP , w której nazwę pliku zastępuje nazwa gniazda nasłuchu .+56 0A51 - 6. Jeśli na przyjęcie nie czeka żadne połączenie, funkcja CEEGRV będzie zablokowana do chwili nadejścia jakiegoś połączenia. Jeśli zbyt wiele aplikacji klienckich łączy się z serwerem szyb- ciej, niż skrypt jest w stanie wywoływać funkcję CEEGRV , będą one musiały czekać w kolejce, której parametry określa wywołanie NKUVGP . Funkcja CEEGRV zwraca wartość niezdefiniowa- ną WPFGH, jeśli zaistnieje jakikolwiek z licznych warunków wystąpienia błędów i ustawia  na odpowiedni komunikat o błędzie. $my_addr = getsockname(SOCK) $remote_addr = getpeername(SOCK) Gdy zaistnieje potrzeba odzyskania lokalnego lub zdalnego adresu skojarzonego z gniazdem, można wykorzystać do tego celu funkcję IGVUQEMPCOG lub IGVRGGTPCOG . Funkcja IGVUQEMPC OG zwraca upakowany adres binarny lokalnego gniazda oraz wartość WPFGH, jeśli gniazdo nie jest powiązane. Funkcja IGVRGGTPCOG zachowuje się podobnie — jedyna różnica polega na tym, że zwraca adres zdalnego gniazda i wartość niezdefiniowaną WPFGH, jeśli to gniazdo nie jest podłączone. Obydwie funkcje zwracają adresy, które muszą być rozpakowane przy użyciu funkcji UQEMCFFTAKP — tak, jak pokazuje następujący przykład: +H TGOQVGACFFTIGVRGGTPCOG 51 - ] O[ RQTVKR UQEMCFFTAKP TGOQVGACFFT  O[JQUVIGVJQUVD[CFFT KR#(A+0 (  RTKPV)PKCFQLGUVRQFđæEQPGFQJQUVPCRQTEKGRQTV PK _ Ograniczenia skryptu tcp_echo_serv1.pl Skrypt tcp_echo_serv1.pl pracuje zgodnie z intencją jego autora, niemniej jednak po- siada kilka wad, które omówimy w kolejnych rozdziałach. Do jego niedoskonałości należy zaliczyć: Rozdział 4. ♦ Protokół TCP 119 1. Brak obsługi nadchodzących połączeń wielokrotnych. Jest to z całą pewnością największy problem. Serwer może przyjąć jednorazowo tylko jedno połączenie. W czasie, gdy jest zajęty obsługą przyjętego połączenia, wszystkie inne żądania połączenia będą oczekiwać na swoją kolej, aż izakończy się bieżące połączenie i pętla główna ponownie wywoła funkcję CEEGRV . Gdy liczba klientów oczekujących na swą kolej przekroczy wartoiść podaną przez NKUVGP , wszystkie nowe połączenia zostaną odrzucone. Aby ominąć ten problem, serwer musiałby przetwarzać wispółbieżnie wątki lub procesy albo zwielokrotniać swoje operacje wejścia-wyjścia. Takie techniki będą szczegółowo omówione w III części tej książki. 2. Serwer pozostaje na pierwszym planie. Po uruchomieniu serwer pozostaje na pierwszym planie i każdy sygnał docierający z klaiwiatury (jak choćby kombinacja klawiszy Ctrl+C) może przerwać jego pracę. Dla serwerów pracujących w trybie długotrwałym konieczne będzie uiniezależnienie ich od poleceń wprowadzanych z klawiatury i przeniesieniie z pierwszego planu do procesu działającego w tle. Techniki niezbędne do wykonania tego zadania opisane są w rozdziale 10., „Serwery współbieżne oraz diemon inetd”. 3. Zapis w rejestrze zdarzeń serwera jest uproszczony. Serwer zapisuje informację o stanie na strumień standardowego wyjścia błędu. Jedniakże solidny serwer będzie uruchomiony jako proces w tle (ang. background process), a zatem nie powinno się określać dla niego standardowego wyjściia błędu do zapisu. Serwer powinien dopisywać wpisy rejestrujące zdarzenia do pliku albo wykorzystać do tego celu oferowane przez sam system operacyjny narzędzia pozwalające dokonywać rejestracji zdarzeń w dziennikiu systemowym. Techniki zapisywania w rejestrze zdarzeń systemowych isą omówione w rozdziale 14., „Ochrona serwerów”. Regulacja ustawień opcji gniazd Gniazda dysponują zestawem opcji, które sterują rozmaitymi aspektami ich działań. Można — między innymi — regulować rozmiary buforów, używanych do wysyłania i przyjmowania danych, dostosowywać wartości limitów czasowych dla wysyłania i przyjmowania danych, istnieje ponadto możliwość zadecydowania, czy gniazdo może być wykorzystane do odbierania transmisji rozgłaszaniia (ang. broadcast transmissions). Opcje ustawione domyślnie sprawdzają się w większości przypadków. Niekiedy jed- nak zachodzi potrzeba regulacji niektórych z nich w celu udoskonalenia jakiejś apli- kacji lub uaktywnienia opcjonalnych cech protokołu TCP/IP. Najczęściej używaną opcją jest 51A4 75 # 4, uruchamiana powszechnie w aplikacjach serwera. Opcje gniazda mogą być sprawdzone lub zmienione za pomocą wbudowanych funk- cji Perla — IGVUQEMQRV oraz UGVUQEMQRV . 120 Część I ♦ Podstawy $value = getsockopt(SOCK,$level,$option_name); $boolean = setsockopt(SOCK,$level,$option_name,$option_value); Funkcje IGVUQEMQRV oraz UGVUQEMQRV umożliwiają sprawdzenie i zmianę opcji gniazda. Pierwszym ich argumentem jest uchwyt pliku 51 - dla uprzednio utworzonego gniazda. Argu- ment drugi — NGXGN — wskazuje poziom stosu sieciowego, na którym ma być wykonana operacja. Najczęściej wykorzystuje się stałą 51.A51 - 6, oznaczającą, że operacje dokonywane są na samym gnieździe. Niekiedy jednak funkcje IGVUQEMQRV i UGVUQEMQRV są wykorzysty- wane do regulacji opcji w protokołach TCP i UDP. W takiej sytuacji używa się numeru protoko- łu zwróconego przez funkcję IGVRTQVQD[PCOG . Wartość trzeciego argumentu — QRVKQPAPCOG — jest liczbą całkowitą, wybraną z obszernej listy możliwych stałych. Ostatni argument — QRVKQPAXCNWG — jest wartością, która ma przyjąć opcja. W przypadkach, w których wartość opcji nie znajduje zastosowania, można podać wartość niezdefiniowaną WPFGH. W przypadku powodzenia IGVUQEMQRV zwraca wartość żądanej opcji, w razie niepowodzenia — wartość WPFGH. Funkcja UGVUQEMQRV zwraca wartość logiczną prawda, gdy opcja została pomyślnie ustawiona; w przeciwnym przypadku zwraca wartość WPFGH. Wartość opcji jest niejednokrotnie znacznikiem logicznym (boolowskim), wskazują- cym, czy opcja powinna być aktywna, czy też nie. W takiej sytuacji do ustawienia i zmiany wartości nie jest potrzebny żaden specjalny kod. W tym przykładzie zade- monstrowano, jak ustawić wartość opcji 51A$41# #56 dla wartości logicznej prawda (rozgłaszanie jest omawiane w rozdziale 20.): UGVUQEMQRV 51 -51.A51 - 651A$41# #56  Tutaj przedstawiony jest sposób odzyskiwania bieżąciej wartości znacznika: O[TGWUGIGVUQEMQRV 51 -51.A51 - 651A$41# #56  Kilka opcji działa na liczbach całkowitych lub innych, rzadko używanych typach da- nych, takich jak choćby struktury VKOGXCN języka C. W takim przypadku, przed prze- kazaniem do funkcji UGVUQEMQRV należy skompresować wartości do postaci binarnej i rozpakować je po wywołaniu IGVUQEMQRV . Dla zilustrowania tego problemu przed- stawimy teraz sposób odzyskiwania maksymalnego rozmiaru buforu, którego używa gniazdo do przechowywania danych. Opcja 51A50 $7( działa na skompresowanej liczbie całkowitej (format +): UGPFADWHHGTAUKGWPRCEM +IGVUQEMQRV UQEM51.A51 - 651A50 $7(  Typowe opcje gniazda W tabeli 4.2 zebrane są typowe opcje gniazd, używane w programowaniu sieciowym. Stałe podane w tabeli są standardowo importowane prizy ładowaniu modułu 5QEMGV. Oto bardziej szczegółowy opis tych opcji: Opcja 51A4 75 # 4 — umożliwia ponowne powiązanie gniazda TCP z będącym w uży- ciu adresem lokalnym. Opcja ta przyjmuje argument logiczny (boolowski) wskazują- cy, czy należy uaktywnić ponowne wykorzystanie adresu. Więcej informacji na ten temat zamieszczono w dalszej części tego rozdziału, w punkcie „Opcja SO_ RE- USEADDR dla gniazda”. Rozdział 4. ♦ Protokół TCP 121 Tabela 4.2.Typowe opcje gniazd Opcja 51A4 75 # 4 51A- 2#.+8 51A.+0) 4 51A$41# #56 51A11$+0.+0 51A50 .19#6 51A4 8.19#6 51A6;2 51A 4414 Opis Uaktywnia ponowne użycie adresu lokalnego Uaktywnia transmisję okresowych komunikatów sprawdzdających aktywność (ang. keepalive messages) Opóźnia zamknięcie gniazda, jeśli są jeszcze dane do dwysłania Umożliwia gniazdu wysyłanie komunikatów na adres rodzgłaszania Umożliwia wstawianie pilnych danych do strumienia wd celu przesłania ich poza kolejnością Pobiera lub ustawia poziom minimalny (ang. low water mark) dla rozmiaru buforu wyjściowego Pobiera lub ustawia poziom minimalny dla rozmiaru bufodru wejścia Pobiera typ gniazda (w trybie tylko do odczytu) Pobiera oraz usuwa ostatni błąd w gnieździe (tylko do dodczytu) Opcja 51A- 2#.+8 — opcja ta, o wartości logicznej prawda, nakazuje, by podłączo- ne gniazdo okresowo przesyłało komunikaty do równorzędnego zdalnego partnera (ang. peer). Jeśli zdalny host nie odpowiada na przesłaną wiadomość, to proces przy kolejnej próbie zapisu do gniazda otrzyma sygnał 2+2 . Odstęp czasowy w wysyłaniu komunikatów sprawdzających aktywność połączenia (ang. keepalive messages) nie może być ustalony w sposób dający się przenosić pomiędzy systemami. Wartość ta jest zróżnicowana w zależności od systemu operacyjnego (przykładowo, dla systemu Linux ten odstęp czasowy wynosi 45 sekund). Opcja 51A.+0) 4 — nadzoruje wydarzenia zachodzące przy próbie zamknięcia gniaz- da TCP, w którym ciągle czekają na wysłanie jakieś dane. Zwykle funkcja ENQUG natychmiast kończy działanie, a system operacyjny stara się wysłać w tle pozostałe dane. Poprzez ustawienie opcji 51A.+0) 4 można również zablokować funkcję ENQ UG w trakcie wywołania aż do chwili, gdy wszystkie dane zostaną wysłane. Umoż- liwia to sprawdzenie, czy wartość zwrócona przez ENQUG informuje o pomyślnie za- kończonym zadaniu. W przeciwieństwie do innych opcji gniazda, 51A.+0) 4 działa na skompresowanym typie danych — tak zwanej strukturze linger. Struktura ta składa się z dwóch liczb całkowitych — znacznika wskazującego, czy opcja 51A.+0) 4 powinna być aktywna oraz z wartości ograniczenia czasowego (ang. timeout), podającego maksymalną licz- bę sekund, o jakie ENQUG powinna opóźnić swoje zakończenie. Struktura linger po- winna być skompresowana i rozpakowana przy użyciu forimatu ++: NKPIGTRCEM ++HNCIVKOGQWV  Na przykład, aby gniazdo opóźniało swe zamknięcie przez 120 sekund, należałoby wpisać: UGVUQEMQRV 51 -51.A51 - 651A.+0) 4RCEM ++ QTFKG0KGOQľPCWUVCYKè51A.+0) 4 122 Część I ♦ Podstawy Opcji 51A$41# #56 można użyć poprawnie tylko w stosunku do gniazd UDP. Jeśli opcja ta ma wartość logiczną prawda, funkcja UGPF może być użyta do wysyłania pakietów na adres rozgłaszania (ang. broadcast address) w celu dostarczenia ich do wszystkich hostów w lokalnej podsieci. Zagadnienia związane z rozgłaszaniem omó- wione są w rozdziale 20. Znacznik opcji 51A11$+0.+0 steruje obsługą pilnych danych, czyli informacji obsłu- giwanych poza kolejnością (ang. out-of-band information). Dzięki temu równorzęd- ny zdalny partner zostaje zaalarmowany o obecności danych o wysokim priorytecie. W rozdziale 17. opisano to nieco dokładniej. Opcje 51A50 .19#6 oraz 51A4 8.19#6 ustawiają poziom minimalny dla rozmiaru bufo- rów — odpowiednio wyjścia i wejścia. Znaczenie tych opcji jest szerzej omówione w rozdziale 13., zatytułowanym „Nieblokujące operacje wejścia-wyjścia”. Obie opcje są liczbami całkowitymi i muszą być kompresowane i rozpakowywane z użyciem for- matu kompresowania +. Opcja 51A6;2 jest opcją przeznaczoną tylko do odczytu. Zwraca typ gniazda, na przy- kład 51 -A564 #/. Przed użyciem trzeba rozpakować tę wartość z pomocą formatu +. Metoda UQEMQRV modułu +15QEMGV, omówiona w rozdziale 5., dokonuje automa- tycznej konwersji. Ostatnia z typowych opcji gniazda — 51A 4414 — jest także opcją przeznaczoną tyl- ko do odczytu; zwraca kod błędu (jeśli wystąpił błąd) dla ostatniej operacji. Używana jest dla pewnych operacji asynchronicznych, takich jak połączenia nieblokujące (zo- bacz rozdział 13.). Błąd jest usuwany po jego odczytaniu. Tak jak w poprzednich przy- padkach, użytkownicy IGVUQEMQRV muszą rozpakować tę wartość przed jej użyciem za pomocą formatu +. Automatycznie dokonuje tego moduł +15QEMGV. Opcja SO_REUSEADDR dla gniazda Wielu programistów zapragnie aktywować znacznik opcji 51A4 75 # 4 w aplika- cjach serwera. Znacznik ten umożliwia serwerowi powtórne powiązanie z adresem, który jest już w użyciu. To z kolei pozwala serwerowi na ponowne uruchomienie, na- stępujące natychmiast po krachu serwera lub po przerwaniu jego pracy. Bez tej opcji wywołanie DKPF nie powiedzie się, dopóki wszystkie nawiązane wcześniej połącze- nia nie wyczerpią swoich limitów czasowych — czyli naiwet przez kilka minut. Aktywacja opcji 51A4 75 # 4 polega na wstawieniu następującego wiersza kodu po wywołaniu funkcji UQEMGV , a przed wywołaniem funkcji DKPF : UGVUQEMQRV 51 -51.A51 - 651A4 75 # 4 QTFKGUGVUQEMQRV Pewnym mankamentem ustawienia opcji 51A4 75 # 4 jest wystąpienie możliwości dwukrotnego uruchomienia serwera. W takim przypadku obydwa procesy będą mogły wiązać się z tym samym adresem bez powodowania błędu, a następnie będą rywali- zowały o nadchodzące połączenia, co będzie prowadzić do mylących wyników. Ser- wery, które zostaną opracowane w kolejnych rozdziałach (na przykład w rozdziałach 10., 14. i 15.), omijają taką ewentualność, tworząc przy uruchomieniu programu plik i usuwając go przy zakończeniu programu. Serwer odmawia rozpoczęcia pracy, gdy dostrzega istnienie takiego pliku. Rozdział 4. ♦ Protokół TCP 123 Bez względu na ustawienia opcji 51A4 75 # 4, system operacyjny nie pozwala, by adres gniazda powiązany przez proces jakiegoś użytkownika był powiązany z proce- sem innego użytkownika. Funkcje fcntl() i ioctl() Oprócz opcji gniazda do regulacji ustawień licznych atrybutów mogą być wykorzy- stane funkcje HEPVN i KQEVN . Funkcja HEPVN jest omówiona w rozdziale 13., w któ- rym wykorzystana jest do włączenia nieblokującej operacji wejścia-wyjścia oraz w roz- dziale 17., w którym użyto jej do ustawienia właściciela gniazda tak, by otrzymywał on sygnał 74) wtedy, gdy gniazdo otrzymuje pilne dane TCP. Także funkcja KQEVN pojawia się w rozdziale 17., w którym jest wykorzystana do implementacji funkcji UQEMCVOCTM , obsługującej pilne dane. Ponadto napotkamy ją w rozdziale 21., gdzie utworzony zostanie cały wachlarz funkcji sprawdzających i modyfikujących adresy IP przypisane interfejsom sieiciowym. Inne funkcje odnoszące się do gniazd Do poznanych już funkcji związanych z gniazdami doliczyć należy trzy kolejne wbu- dowane funkcje Perla: UGPF , TGEX oraz UQEMGVRCKT . Dwie pierwsze będą wyko- rzystane w późniejszych rozdziałach tej książki, przy omawianiu pilnych danych TCP (rozdział 17.) i protokołu UDP (rozdziały 17 – 20). $bytes = send(SOCK,$data,$flags[,$destination]) Funkcja UGPF używa gniazda wskazanego przez pierwszy argument 51 -, by dostarczyć dane, wskazane przez argument FCVC, na adres docelowy, określony przez FGUVKPCVKQP. Jeśli dane pomyślnie zostały ustawione w kolejce do przesłania, funkcja UGPF zwróci liczbę wysłanych bajtów. W przeciwnym przypadku zwraca wartość nieokreśloną — WPFGH. Argument trzeci — HNCIU — może mieć wartość 0, wartość jednej z dwóch opcji wybranych z tabeli 4.3 lub mo- że być określony jako wynik działania operatora bitowej alternatywy dla tych dwóch opcji. Znacznik /5)A11$ zostanie omówiony szczegółowo w rozdziale 17. Znacznik /5)A 1064176 jest używany w programach określających marszruty (ang. routing programs) oraz w programach diagnostycznych i nie będzie omawiany w tej książce. Wyrażeniem zgody na standardowe za- chowanie funkcji UGPF będzie przekazanie 0 jako wartości argumentu HNCIU. Jeżeli gniazdo jest podłączonym gniazdem TCP, argument FGUVKPCVKQP nie powinien być określony, a funk- cja UGPF będzie w pewnym stopniu odpowiadała funkcji U[UYTKVG . W przypadku gniazd UDP adres docelowy może być zmieniany przy każdym wywoławniu funkcji UGPF . Tabela 4.3. Znaczniki send() Opcja /5)A11$ /5)A 1064176 Opis Przekaż bajt pilnych danych na gniazdo TCP Omiń tablice marszrut 124 Część I ♦ Podstawy $address = recv(SOCK,$buffer,$length,$flags) Funkcja TGEX przyjmuje ze wskazanego gniazda co najwyżej NGPIVJ bajtów i umieszcza je w zmiennej skalarnej DWHHGT. Zmienna rośnie lub kurczy się do wielkości odpowiadającej faktycznie przeczytanej liczbie bajtów danych. Argument HNCIU ma znaczenie analogiczne do odpowiadającego mu argumentu w funkcji UGPF i powinien być z reguły ustawiony na wartość 0. W przypadku powodzenia funkcja TGEX zwraca skompresowany adres gniazda nadawcy wiadomości. W razie błędu funkcja zwraca wartość nieokreśloną WPFGH i ustawia odpowiednio zmienną . Gdy funkcja TGEX jest wywołana na podłączonym gnieździe TCP, działa podobnie do funkcji U[UTGCF , z tą różnicą, że zwraca adres równorzędnego zdalnego partnera. Przy- datność funkcji TGEX sprawdza się zwłaszcza przy przyjmowaniu datagramów w transmisji UDP. $boolean = socketpair(SOCK_A,SOCK_B,$type,$protocol) Funkcja UQEMGVRCKT tworzy parę nie nazwanych gniazd połączonych swymi zakończeniami. Argumenty FQOCKP, V[RG oraz RTQVQEQN odpowiadają analogicznym argumentom z funkcji UQE MGV . W przypadku powodzenia funkcja UQEMGVRCKT zwraca wartość logiczną prawda i otwie- ra gniazda uchwytu 51 -A# oraz 51 -A$. Funkcja UQEMGVRCKT przypomina funkcję RKRG z rozdziału 2., przy czym w tym przypadku połączenie jest dwukierunkowe. Zazwyczaj skrypt tworzy parę gniazd, a na- stępnie rozwidla się za pomocą funkcji HQTM na proces macierzysty, zamykający jed- no gniazdo i proces potomny, zamykający drugie. Oba gniazda mogą być następnie użyte do dwukierunkowej komunikacji pomiędzy procesem macierzystym i potomnym. Podczas gdy funkcja UQEMGVRCKT jest z reguły używana w protokołach INET, w rze- czywistości większość systemów obsługuje ją tylko przy tworzeniu gniazd domeny UNIX. Oto schemat kodu tej funkcji: UQEMGVRCKT 51 -51 -#(A70+:51 -A564 #/2(A7052 QTFKG W rozdziale 22. zostaną przedstawione przykłady użyciai gniazd domeny UNIX. Stałe końca wiersza eksportowane przez moduł gniazda Moduł 5QEMGV, jak już wiemy, wykorzystuje stałe do budowy gniazd i ustalania połą- czeń wychodzących, ale — o czym właśnie się przekonamy — może również eks- portować stałe i zmienne, wykorzystywane w odniesieniu do zorientowanych teksto- wo serwerów sieciowych. Jak widzieliśmy w rozdziale 2., różne systemy operacyjne w inny sposób interpretują budowę końca wiersza w pliku tekstowym. Niektóre systemy używają znaku powrotu karetki (ang. carriage return, 4), inne znaku przesunięcia wiersza (ang. linefeed, .(), a jeszcze inne obydwu znaków, użytych łącznie ( 4.(). Dodatkowe trudności wprowa- dzają znaki T i P — sekwencje sterujące z lewym ukośnikiem w Perlu, które w za- leżności od lokalnego systemu operacyjnego i jego sposobu interpretowania końca wiersz
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Perl. Tworzenie aplikacji sieciowych
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: