Architektura typu klient serwer: przesyłanie pliku tekstowo oraz logowania do serwera za pomocą szyfrowanego hasła



Podobne dokumenty
Architektura typu klient serwer: uproszczony klient POP3

Podstawowe typy serwerów

Gniazda BSD. komunikacja bezpołączeniowa

3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);

Gniazda UDP. Bartłomiej Świercz. Łódź, 3 kwietnia Katedra Mikroelektroniki i Technik Informatycznych. Bartłomiej Świercz Gniazda UDP

Klient-Serwer Komunikacja przy pomocy gniazd

Gniazda BSD. Procesy w środowisku sieciowym. Gniazda podstawowe funkcje dla serwera. Gniazda podstawowe funkcje dla klienta

Programowanie przy użyciu gniazdek

Programowanie sieciowe

Literatura uzupełniająca: W. Richard Stevens, Programowanie zastosowań sieciowych w systemie Unix WNT 1998

Programowanie współbieżne i rozproszone

Iteracyjny serwer TCP i aplikacja UDP

Gniazda surowe. Bartłomiej Świercz. Łódź,9maja2006. Katedra Mikroelektroniki i Technik Informatycznych. Bartłomiej Świercz Gniazda surowe

Programowanie aplikacji równoległych i rozproszonych. Wykład 4

MODEL WARSTWOWY PROTOKOŁY TCP/IP

Gniazda - Wstęp. Oprogramowanie systemów równoległych i rozproszonych. Sposób komunikacji. Domena adresowa. olas@icis.pcz.pl

Aplikacja Sieciowa wątki po stronie klienta

2. Interfejs gniazd Gniazdo

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

Sieci komputerowe. Wykład 5: Warstwa transportowa: TCP i UDP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski

PROTOKOŁY WARSTWY TRANSPORTOWEJ

Programowanie Sieciowe 1

Instytut Teleinformatyki

Komunikacja sieciowa - interfejs gniazd

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

Gniazda BSD implementacja w C#

Protokoły sieciowe - TCP/IP

Sieci komputerowe. Wykład 7: Transport: protokół TCP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

Krótkie wprowadzenie do korzystania z OpenSSL

Aplikacja Sieciowa. Najpierw tworzymy nowy projekt, tym razem pracować będziemy w konsoli, a zatem: File->New- >Project

Przesyłania danych przez protokół TCP/IP

Wybrane działy Informatyki Stosowanej

Laboratorium Sieci Komputerowych - 2

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

Laboratorium - Przechwytywanie i badanie datagramów DNS w programie Wireshark

Oprogramowanie komunikacyjne dla Internetu rzeczy Laboratorium nr 4 komunikacja unicastowa IPv6

Politechnika Łódzka. Instytut Systemów Inżynierii Elektrycznej

Wykład 4: Protokoły TCP/UDP i usługi sieciowe. A. Kisiel,Protokoły TCP/UDP i usługi sieciowe

Sieci komputerowe. Zajęcia 3 c.d. Warstwa transportu, protokoły UDP, ICMP

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

Serwer współbieżny połączeniowy

ZESZYTY ETI ZESPOŁU SZKÓŁ W TARNOBRZEGU Nr 1 Seria: Teleinformatyka 2013

1 Moduł Diagnostyki Sieci

1. Model klient-serwer

socket(int domain, int type, int protocol)

Mechanizmy pracy równoległej. Jarosław Kuchta

Model OSI/ISO. Komputer B. Warstwy w modelu OSI aplikacji. aplikacji. prezentacji Komputer A. prezentacji. sesji. sesji. komunikacja wirtualna

Transport. część 2: protokół TCP. Sieci komputerowe. Wykład 6. Marcin Bieńkowski

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Transport. część 2: protokół TCP. Sieci komputerowe. Wykład 6. Marcin Bieńkowski

Komunikacja z użyciem gniazd aplikacje klient-serwer

Dr Michał Tanaś(

1.1 Przykład znajdowanie liczb pierwszych leżących w zadanym zakresie, tryb bezpołączeniowy

Protokoły zdalnego logowania Telnet i SSH

TCP - receive buffer (queue), send buffer (queue)

Opracowanie protokołu komunikacyjnego na potrzeby wymiany informacji w organizacji

EGZAMIN MATURALNY 2011 INFORMATYKA

Zadanie 2: transakcyjny protokół SKJ (2015)

ARP Address Resolution Protocol (RFC 826)

Tunelowanie, kapsułkowanie, XDR. 1. Transmisja tunelowa i kapsułkowanie serwery proxy. 2. Zewnętrzna reprezentacja danych XDR.

Akademickie Centrum Informatyki PS. Wydział Informatyki PS

Unicast jeden nadawca i jeden odbiorca Broadcast jeden nadawca przesyła do wszystkich Multicast jeden nadawca i wielu (podzbiór wszystkich) odbiorców

Stos protokołów TCP/IP (ang. Transmission Control Protocol/Internet Protocol)

Gatesms.eu Mobilne Rozwiązania dla biznesu

Zadanie1: Odszukaj w serwisie internetowym Wikipedii informacje na temat usługi DHCP.

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

Sieci komputerowe Warstwa transportowa

Sprawozdanie. (notatki) Sieci komputerowe i bazy danych. Laboratorium nr.3 Temat: Zastosowanie protokołów przesyłania plików

Współpraca z platformą Emp@tia. dokumentacja techniczna

ZiMSK. Konsola, TELNET, SSH 1

Oprogramowanie systemów równoległych i rozproszonych. Wykład 6

Kolejki FIFO (łącza nazwane)

Referencyjny model OSI. 3 listopada 2014 Mirosław Juszczak 37

4.2 Sposób korzystania z l acza

Programowanie Sieciowe 1

TCP/IP. Warstwa aplikacji. mgr inż. Krzysztof Szałajko

Wydział Informatyki, Elektroniki i Telekomunikacji Katedra Telekomunikacji

Obsługa plików. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 25 września 2011

Wykład Nr Sieci bezprzewodowe 2. Monitorowanie sieci - polecenia

Wykład 3 / Wykład 4. Na podstawie CCNA Exploration Moduł 3 streszczenie Dr inż. Robert Banasiak

Przykłady interfejsu TCP i UDP w Javie

Dokumentacja wstępna TIN. Rozproszone repozytorium oparte o WebDAV

Ćwiczenie 2. Obsługa gniazd w C#. Budowa aplikacji typu klient-serwer z wykorzystaniem UDP.

Funkcje zawarte w bibliotece < io.h >

5. Model komunikujących się procesów, komunikaty

Sieci Komputerowe Modele warstwowe sieci

Serwer SSH. Wprowadzenie do serwera SSH Instalacja i konfiguracja Zarządzanie kluczami

Programy typu klient serwer. Programowanie w środowisku rozproszonym. Wykład 5.

ZiMSK dr inż. Łukasz Sturgulewski, DHCP

1. Model klient-serwer

Tworzenie aplikacji rozproszonej w Sun RPC

Komunikator internetowy w C#

Przekierowanie portów w routerze - podstawy

POŁĄCZENIE STEROWNIKÓW ASTRAADA ONE MIĘDZY SOBĄ Z WYKORZYSTANIEM PROTOKOŁU UDP. Sterowniki Astraada One wymieniają między sobą dane po UDP

Gniazda. S. Samolej: Gniazda 1

Sieci komputerowe w sterowaniu informacje ogólne, model TCP/IP, protokoły warstwy internetowej i sieciowej

Sieci komputerowe i bazy danych

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 13 Topologie sieci i urządzenia

System operacyjny UNIX Internet. mgr Michał Popławski, WFAiIS

Transkrypt:

Architektura typu klient serwer: przesyłanie pliku tekstowo oraz logowania do serwera za pomocą szyfrowanego hasła Wydział Inżynierii Mechanicznej i Informatyki Instytut Informatyki Teoretycznej i Stosowanej dr inż. Łukasz Szustak

Komunikacja bezpołączeniowa (SOCK_DGRAM) Główna koncepcja komunikacji bezpołączeniowej

Komunikacja bezpołączeniowa (SOCK_DGRAM) Gniazda typu SOCK_DGRAM komunikacja w modelu bezpołączeniowym korzystającą z tzw. datagramów Datagram blok danych pakietowych przesyłany przez sieć między komputerami, zawierający wszelkie niezbędne informacje do przesłania danych z hosta źródłowego do hosta docelowego, bez konieczności wcześniejszej wymiany informacji przez te hosty Datagram jest podstawową jednostką przesyłania danych w sieciach pakietowych, w których czas i kolejność dostarczenia kolejnych jednostek danych nie są gwarantowane

Komunikacja bezpołączeniowa (SOCK_DGRAM) Gniazdo może zostać opisane przy pomocy domeny adresowej, w której wyróżniamy m.in. domenę internetową PF_INET W przypadku komunikacji bezpołączeniowej oraz domeny internetowej komunikacji odbywać się będzie w oparciu o protokół UDP (User Datagram Protocol) W dalszej części prezentacji zostanie przedstawiony przykład pary programów: klient oraz serwer, których zadaniem będzie przesłanie plików tekstowych z wykorzystaniem gniazd w modelu komunikacji bezpołączeniowej w domenie internetowej PF_INET

Serwer #define _XOPEN_SOURCE #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdio.h> #include <netdb.h> #include <cstdlib> #include <cstring> #include <string> #include <iostream> #include <fcntl.h> #define SRVPORT 1111 /* numer portu serwera */ #define CLIPORT 31337 /* numer portu gniazda klienta */ #define SRVADDR "localhost" /* adres serwera */ #define PASSWD "alakota" /* haslo wymagane do polaczenia z serwerem */ #define CSALT "Zz" /* dwuznakowy tzw. salt dla funkcji crypt() */ #define PLIK "/proc/cpuinfo" /* plik, który wyślemy klientowi */

Serwer Otwieramy lokalne gniazdo (PF_INET, SOCK_DGRAM) int main (void) { int sd, fd, ret; /* deskryptor gniazda, deskryptor pliku, pomocnicza */ struct sockaddr_in saddr, caddr; /* adres lokalnego gniazda, adres zdalnego gniazda */ char buf[1024], /* bufor */ hash[20]; /* bufor na zahashowane hasło */ socklen_t len; sd = socket (PF_INET, SOCK_DGRAM, 0); if (sd < 0) { perror ("socket()"); exit (1); Następnie przypisujemy mu adres aby zdalni klienci byli w stanie wysyłać do serwera datagramy (gniazdo musi mieć przypisany adres aby możliwa była komunikacja z nim)

Serwer saddr.sin_family = PF_INET; saddr.sin_port = htons (SRVPORT); saddr.sin_addr.s_addr = INADDR_ANY; if (bind (sd, (struct sockaddr *) &saddr, sizeof (saddr)) < 0) { perror ("bind()"); exit (1); Następnie jest obliczany tzw. one way hash na podstawie hasła (PASSWD) i tzw. salt. Salt jest prawie dowolnym dwuliterowym ciągiem znaków ([a-z, A-Z, 0-9]) i jest stosowane przez algorytm liczenia funkcji hashującej sprintf (hash, "%s", crypt (PASSWD, CSALT)); printf ("Czekam na datagramy...\n");

Serwer W dalszej kolejności jest pętla, w której są obsługiwane nadchodzące żądania od klientów while (true) { bzero (buf, sizeof (buf)); len = sizeof (caddr); recvfrom (sd, buf, sizeof (buf), 0, (struct sockaddr *) &caddr, &len); Wywołanie recvfrom() blokuje do czasu, aż nadejdą jakieś dane do odczytania Kiedy tak się stanie struktura wskazywana przez *from zostanie wypełniona adresem gniazda, z którego te dane nadeszły

Serwer Poniższy fragment kodu sprawdza, czy klient jest upoważniony do komunikacji z serwerem Procedura autoryzacji klienta oparta jest na dwóch elementach: haśle i porcie źródłowym (porcie, z którego nadaje klient) Serwer oczekuje od klienta datagramu zawierającego ciąg (hash) utworzony na maszynie klienta w ten sam sposób, co na serwerze Jeśli wyniki działania funkcji hashujących na serwerze i na kliencie pokrywają się oraz jeśli port źródłowy zgadza się z wcześniej ustalonym po obu stronach to serwer wyśle w stronę klienta datagram zawierający odpowiedź 'OK' printf ("Datagram od %s:%i... ", inet_ntoa (caddr.sin_addr), ntohs (caddr.sin_port)); if (!strncmp (buf, hash, strlen (hash)) && ntohs (caddr.sin_port) == CLIPORT) { printf ("Przyjęty.\n"); sendto (sd, "OK\n", 3, 0, (struct sockaddr *) &caddr, sizeof (caddr));

Serwer W dalszej części programy otwierany jest wcześniej zdefiniowany plik i po kawałku przesyłamy go do klienta Kiedy cały plik zostanie przesłany, wysyłany jest klientowi ciąg znaków 'END' aby poinformować, że transmisja się powiodła fd = open(plik, O_RDONLY); if (fd < 1) { perror ("open()"); sendto (sd, "Błąd: open()\n", 13, 0, (struct sockaddr *) &caddr, sizeof (caddr)); bzero (buf, sizeof (buf)); while (read (fd, buf, sizeof (buf)) > 0) { sendto (sd, buf, strlen (buf), 0, (struct sockaddr *) &caddr, sizeof (caddr)); bzero (buf, sizeof (buf)); close (fd); sendto (sd, "END\n", 4, 0, (struct sockaddr *) &caddr, sizeof (caddr));

Serwer Blok else wykonuje się jeśli któryś z elementów autoryzacji (hasło, port źródłowy) jest niepoprawny W tym miejscu również się kończy główna pętla while oraz cały kod serwera else { printf ("Odrzucony.\n"); sendto (sd, "Błąd: złe hasło albo port źródłowy\n", 4, 0, (struct sockaddr *) &caddr, sizeof (caddr)); return 0;

Klient Kod klienta niewiele różni się od kodu serwera #define _XOPEN_SOURCE #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdio.h> #include <netdb.h> #include <cstdlib> #include <cstring> #include <string> #include <iostream> #include <fcntl.h> #define SRVPORT 1111 /* numer portu serwera */ #define CLIPORT 31337 /* numer portu gniazda klienta */ #define SRVADDR "localhost" /* adres serwera */ #define PASSWD "alakota" /* haslo wymagane do polaczenia z serwerem */ #define CSALT "Zz" /* dwuznakowy tzw. salt dla funkcji crypt() */

Klient W pierwszej kolejności tworzone jest lokalne gniazda Drugim krokiem w tym przypadku jest ręczne przypisanie adresu do lokalnego gniazda Tą czynność można pozostawić systemowi, jednakże w przedstawianym przypadku ze względu na autoryzację należy numer portu musi zostać dobrany we właściwy sposób, ponieważ serwer nie zgodzi się na sesję jeśli nie będziemy wysyłali datagramów ze ściśle określonego gniazda

Klient int main () { int sd; struct sockaddr_in saddr, caddr; struct hostent *sent; /* struktura opisująca host-serwer */ char buf[1024]; /* bufor */ socklen_t len; sd = socket (PF_INET, SOCK_DGRAM, 0); if (sd < 0) { perror ("socket()"); exit(1); caddr.sin_family = PF_INET; caddr.sin_port = htons (CLIPORT); caddr.sin_addr.s_addr = INADDR_ANY; if (bind (sd, (struct sockaddr *) &caddr, sizeof (caddr)) < 0) { perror ("bind()"); exit(1);

Klient Kolejnym krokiem jest wypełnienie struktury sockaddr gniazda zdalnego printf ("Szukam adresu IP serwera %s...\n", SRVADDR); sent = gethostbyname (SRVADDR); if (!sent) { herror ("gethostbyname()"); exit (1); saddr.sin_family = PF_INET; saddr.sin_port = htons (SRVPORT); bcopy (sent->h_addr, (char *) &saddr.sin_addr, sent->h_length); Do bufora jest kopiowany wynik działania funkcji hashującej bzero (buf, sizeof (buf)); sprintf (buf, "%s", crypt (PASSWD, CSALT));

Klient Do serwera jest wysyłane zakodowane hasło, a następnie klient oczekuje na przyzwolenie do dalszej komunikacji printf ("Wysyłam hasło do %s:%i...\n", inet_ntoa(saddr.sin_addr), SRVPORT); sendto (sd, buf, strlen (buf), 0, (struct sockaddr *) &saddr, sizeof (saddr)); printf ("Czekam na odpowiedź...\n"); do { bzero (buf, sizeof(buf)); len = sizeof(caddr); recvfrom (sd, buf, sizeof(buf), 0, (struct sockaddr *) &caddr, &len); while (caddr.sin_addr.s_addr!= saddr.sin_addr.s_addr); Należy tutaj zwrócić szczególną uwagę na fakt, że istnieje możliwość przyjścia na nasz adres jakiegoś przypadkowego datagramu nie związanego zupełnie z sesją między nami a serwerem W pętli do-while są odbierane kolejne datagramy, które przychodzą na adres klienta W sytuacji gdy otrzymany datagram pochodzi od serwera, kod programy pozwoli na kontynuację programu

Klient W dalszej części programu weryfikowane jest czy odebrana informacja jest to odpowiedź na wysłany wcześniej przez program klienta datagram z hasłem (ciąg 'OK') if( strncmp(buf, "OK", 2) ) { fprintf (stderr, "Nieprawidlowe haslo albo zly port zrodlowy. Koncze...\n"); exit(1); else printf ("Polaczenie przyjete.\n\n"); Ostatnim fragmentem programu jest pętla, która ponownie przegląda wszystkie nadchodzące datagramy, sprawdza, czy pochodzą one od serwera, a następnie podejmuje jedno z trzech działań: jeśli datagram zawiera ciąg 'END' to znaczy, że serwer zakończył już transmisję pliku jeśli zawiera ciąg 'Błąd:' to wyświetlany jest komunikat błędu oraz kończymy program

Klient ostatnia możliwość jest nadejście datagramu zawierającego część przesyłanego pliku: w tym przypadku jest wyświetlana cała zawartość datagramu na standardowym wyjściu bzero (buf, sizeof (buf)); len = sizeof (caddr); while (recvfrom (sd, buf, sizeof (buf), 0, (struct sockaddr *) &caddr, &len) > 0) { if (caddr.sin_addr.s_addr == saddr.sin_addr.s_addr) { if (!strncmp (buf, "END", 3)) { break; else if (!strncmp (buf, "Błąd:", 5)) { printf ("%s", buf); break; else printf ("%s", buf); bzero (buf, sizeof (buf)); len = sizeof (buf); return 0;

Podsumowanie W omawianym przypadku wystarczy jedno gniazdo aby obsłużyć wielu klientów W bardziej skomplikowanych przypadkach uzasadnione może stać się przydzielenie każdemu klientowi osobnego procesu Główną wadą omawianego przykładu jest brak gwarancji, że dane dotrą w niezmienionej postaci do klienta oraz, że w ogóle dotrą Wadę tej można uniknąć stosując komunikację w modelu połączeniowym z użyciem pakietu TCP

Podsumowanie Komunikacja połączeniowa wykorzystująca protokół TCP, wysyła klientowi pakiety, a następnie oczekuje od niego potwierdzenia, że pakiet pomyślnie dotarł do celu Jeśli w pewnym przedziale czasu nie ma potwierdzenia to następuje ponowna próba przesłania pakietu w przypadku definitywnego braku połączenia warstwa TCP zasygnalizuję błąd Powyższym mechanizmem nie dysponuje protokół UDP, jednakże można samemu zaimplementować podobną procedurę weryfikacji

Podsumowanie Należy również zwrócić uwagę na niewielkie różnice pomiędzy serwerem i klientem opartymi na tym protokole Oba programy przeglądają wszystkie nadchodzące datagramy, a różnica pojawia się właściwie dopiero w warstwie aplikacji modelu sieciowego