Komunikacja sieciowa - interfejs gniazd

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

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

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

Iteracyjny serwer TCP i aplikacja UDP

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

Gniazda BSD. komunikacja bezpołączeniowa

Programowanie Sieciowe 1

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

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

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

2. Interfejs gniazd Gniazdo

Programowanie przy użyciu gniazdek

Podstawowe typy serwerów

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

Programowanie sieciowe

Gniazda. S. Samolej: Gniazda 1

Tryb bezpołączeniowy (datagramowy)

1. Model klient-serwer

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

Gniazda BSD implementacja w C#

Instytut Teleinformatyki

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

Klient-Serwer Komunikacja przy pomocy gniazd

Komputery i Systemy Równoległe Jędrzej Ułasiewicz 1

Programowanie Sieciowe 1

Oprogramowanie komunikacyjne dla Internetu rzeczy Laboratorium nr 4 komunikacja unicastowa IPv6

iseries Programowanie z użyciem gniazd

Programowanie współbieżne i rozproszone

Programowanie sieciowe

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

Projektowanie oprogramowania systemów KOMUNIKACJA SIECIOWA I SYSTEMY RPC

Warstwa transportowa. Warstwa transportowa. Enkapsulacja. Zapewnienie niezawodnego przesyłania danych /wg ISO/ Transmisja bezpołączeniowa

Systemy rozproszone. Krzysztof Banaś Obliczenia równoległe 1

socket(int domain, int type, int protocol)

Programowanie Programowanie z użyciem gniazd

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

PROTOKOŁY WARSTWY TRANSPORTOWEJ

Gniazda BSD UNIWERSYTET GDAŃSKI WYDZIAŁ MATEMATYKI I FIZYKI. Jacek Nowicki

Sieci Komputerowe. Wykład 1: TCP/IP i adresowanie w sieci Internet

Architektura typu klient serwer: uproszczony klient POP3

IBM i Wersja 7.2. Programowanie Programowanie z użyciem gniazd

Programowanie Programowanie z użyciem gniazd

Protokoły sieciowe - TCP/IP

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

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

Serwer współbieżny połączeniowy

MODEL WARSTWOWY PROTOKOŁY TCP/IP

Sieci komputerowe 1 DSRG

Serwery współbieżne c.d.

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

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

W różnych systemach definicje mogą się różnić od powyższej. W linuxie sprobuj man 7 ip do wyswietlenia opisu.

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

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

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

Adresy w sieciach komputerowych

Beej s Guide to Network Programming

TIN Techniki Internetowe zima

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

5. Algorytmy serwera

Model OSI. mgr inż. Krzysztof Szałajko

Podstawowe typy serwerów

Podstawy Transmisji Danych. Wykład IV. Protokół IPV4. Sieci WAN to połączenia pomiędzy sieciami LAN

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

Przykład aplikacji UDP

Wybrane działy Informatyki Stosowanej

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

Plan wykładu. Domain Name System. Hierarchiczna budowa nazw. Definicja DNS. Obszary i ich obsługa Zapytania Właściwości.

Internet Control Message Protocol Aplikacja ping

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

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

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

Programowanie sieciowe

Sieci komputerowe. Zajęcia 5 Domain Name System (DNS)

Przesyłania danych przez protokół TCP/IP

Instytut Teleinformatyki

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

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

Model sieci OSI, protokoły sieciowe, adresy IP

Sieci Komputerowe Modele warstwowe sieci

Bazy Danych i Usługi Sieciowe

Sockety TCP/IP - podstawy. Sieci Komputerowe II Wyk ład 2

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

Systemy operacyjne System sieciowy UNIX-a

Interfejs programowy Windows Sockets 2. Aplikacja klient-serwer TCP Echo

Laboratorium Sieci Komputerowych - 2

Akademia Techniczno-Humanistyczna w Bielsku-Białej

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

1. Model klient-serwer

Plan wykładu. 1. Sieć komputerowa 2. Rodzaje sieci 3. Topologie sieci 4. Karta sieciowa 5. Protokoły używane w sieciach LAN 6.

Wykład 2: Budowanie sieci lokalnych. A. Kisiel, Budowanie sieci lokalnych

Routing. część 3: wewnątrz routera. Sieci komputerowe. Wykład 4. Marcin Bieńkowski

DR INŻ. ROBERT WÓJCIK DR INŻ. JERZY DOMŻAŁ ADRESACJA W SIECIACH IP. WSTĘP DO SIECI INTERNET Kraków, dn. 24 października 2016r.

Stos TCP/IP Warstwa transportowa Warstwa aplikacji cz.1

Routing. część 3: wewnątrz routera. Sieci komputerowe. Wykład 4. Marcin Bieńkowski

Łącza nienazwane(potoki)

Tworzenie aplikacji rozproszonej w Sun RPC

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

Transkrypt:

SOE Systemy Operacyjne Wykład 14 Komunikacja sieciowa - interfejs gniazd dr inŝ. Andrzej Wielgus Instytut Mikroelektroniki i Optoelektroniki WEiTI PW

Model komunikacji sieciowej Model OSI (ang. Open System Interconnection) model warstwowy połączenia systemów otwartych opracowany przez Międzynarodową Organizację Normalizacyjną ISO Model definiuje: funkcje warstw protokoły komunikacji z warstwami interfejsy między warstwami

Model OSI 7 6 5 4 3 2 1 warstwa zastosowań warstwa prezentacji warstwa sesji warstwa transportowa warstwa sieciowa warstwa kanałowa warstwa fizyczna komunikaty komunikaty komunikaty komunikaty pakiety ramki bity

Model uproszczony 7 warstwa zastosowań 6 warstwa prezentacji 5 warstwa sesji warstwa procesu 4 4 warstwa transportowa warstwa transportowa 3 3 warstwa sieciowa warstwa sieciowa 2 2 warstwa kanałowa warstwa kanałowa 1 1 warstwa fizyczna

Protokoły transmisji Rodzina protokołów zbiór protokołów wszystkich warstw modelu rodzina TCP/IP protokoły Internetu Tryb komunikacji połączeniowy bezpołączeniowy

Rodzina protokołów TCP/IP 4 3 proces proces proces proces TCP UDP API interfejs programu uŝytkowego 2 ICMP IP ARP RARP 1 Ethernet...

Asocjacja Połączenie ustanawiane jest między dwoma procesami działającymi na dwóch komputerach Asocjacja 5-elementowy zbiór parametrów opisujący połączenie: protokół adres lokalny proces lokalny adres zdalny proces zdalny

Model klient serwer Model komunikacji procesów relacja asymetryczna między serwerem i klientem Serwer: otwiera kanał komunikacji informuje system operacyjny o gotowości odbierania zleceń od klientów pod ustalonym, ogólnie znanym adresem oczekuje na zlecenia klientów odbiera i przetwarza zlecenie w sposób uzaleŝniony od rodzaju serwera, a następnie wysyła odpowiedź do klienta powraca do oczekiwania na kolejne zlecenia

Model klient - serwer Klient: otwiera kanał komunikacji nawiązuje połączenie z serwerem pod ogólnie znanym adresem (tylko w protokole połączeniowym) wysyła zlecenie na ogólnie znany adres serwera odbiera odpowiedź od serwera powtarza dwie powyŝsze czynności zamyka kanał komunikacyjny i kończy działanie

Rodzaje serwerów Iteracyjny bezpośrednio obsługuje nadchodzące zlecenia klientów stosowany, gdy czas obsługi pojedyńczego zlecenia jest znany i stosunkowo krótki zwykle wykorzystuje protokół datagramowy WspółbieŜny tworzy nowy proces potomny lub wątek do obsługi kaŝdego kolejnego zlecenia sam oczekuje na kolejne połączenie stosowany, gdy czasy obsługi nie są określone i mogą być długie zwykle wykorzystuje protokół połączeniowy

Gniazda BSD Interfejs programu uŝytkowego API Dziedzina komunikacji rodzina protokołów komunikacyjnych dziedzina Internetu - protokoły TCP/IP dziedzina systemu UNIX - protokoły wewnętrzne

Scenariusz transmisji połączeniowej SERWER socket() bind() listen() tworzenie gniazd adresowanie nawiązanie połączenia KLIENT socket() accept() connect() read() write() komunikacja zlecenie odpowiedź write() read()

Scenariusz transmisji bezpołączeniowej SERWER socket() bind() tworzenie gniazd adresowanie KLIENT socket() bind() recvfrom() sendto() komunikacja zlecenie odpowiedź sendto() recvfrom()

Ustalanie asocjacji Protokół Adres lokalny, proces lokalny Adres zdalny, proces zdalny Serwer połączeniowy socket() bind() listen(), accept() Klient połączeniowy socket() connect() Serwer bezpołączeniowy socket() bind() recvfrom() Klient bezpołączeniowy socket() bind() recvfrom()

Adresowanie gniazd Ogólna postać adresu gniazda struct sockaddr { u_short sa_family; - rodzina: AF_xxx (PF_xxx) char sa_data[14]; - adres Rodziny adresów (protokołów) AF_UNIX (PF_UNIX) - protokoły wewnętrzne UNIX AF_INET (PF_INET) - protokoły Internetu TCP/IP

Adresy w dziedzinie Internetu struct sockaddr_in { short sin_family; - rodzina: AF_INET u_short sin_port; - 16-bitowy numer portu struct in_addr sin_addr; struct in_addr { u_long s_addr; - 32-bitowy adres internetowy s_addr =INADDR_ANY - dowolny interfejs sieciowy (adres) komputera

Przekształcanie adresów int inet_aton(const char *cp, struct in_addr *inp); unsigned long int inet_addr(const char *cp); przekształcają adresy internetowe podane w notacji kropkowo-dziesiętnej na liczby 32-bitowe char* inet_ntoa(struct in_addr in); przekształca 32-bitowy adres internetowy na ciąg znaków w notacji kropkowo-dziesiętnej

Numery portów 16-bitowe liczby z zakresu od 0 do 65535 porty zastrzeŝone: 0-1023 porty automatycznie przydzielane przez system: 1024-5000 porty przydzielane dowolnie: 5000-65535

Kolejność bajtów Sieciowa kolejność bajtów starszy bajt przechowywany jest wcześniej (pod niŝszym adresem w pamięci) Przekształcanie kolejności bajtów unsigned long int htonl(unsigned long int hostlong); unsigned short int htons(unsigned short int hostshort); unsigned long int ntohl(unsigned long int netlong); unsigned short int ntohs(unsigned short int netshort);

Adresy w dziedzinie UNIX-a struct sockaddr_un { u_short sun_family; - rodzina: AF_UNIX char sun_path[108]; - nazwa ścieŝkowa pliku

Tworzenie gniazda int socket(int domain, int type, int protocol); Domena komunikacji: AF_xxx lub PF_xxx Typ gniazda: SOCK_STREAM - gniazdo strumieniowe wykorzystujące protokół połączeniowy (np. TCP), SOCK_DGRAM - gniazdo datagramowe wykorzystujące protokół bezpołączeniowy (np. UDP), SOCK_RAW - gniazdo surowe wykorzystujące protokół warstwy sieciowej (np. IP), Protokół zwykle = 0

Przydzielanie adresu int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen); Gniazdo w dziedzinie Internetu związuje adres z gniazdem Gniazdo w dziedzinie UNIX-a nazywa gniazdo, tworzy plik Jawne przydzielenie adresu funkcjąbind() serwer i klient transmisji bezpołączeniowej serwer transmisji połączeniowej Automatyczne przydzielenie adresu przez jądro klient transmisji połączeniowej

Ustanawianie połączenia - serwer int listen(int s, int backlog); Zgłasza w systemie gotowość przyjmowania połączeń ustala maksymalną liczbę połączeń oczekujących na obsłuŝenie (zwykle 5) int accept(int s, struct sockaddr *addr, socklen_t *addrlen); Pobiera pierwsze połączenie z kolejki oczekujących tworzy nowe gniazdo o tych samych własnościach, co stare gniazdo i zwraca jego deskryptor Blokuje proces do momentu nawiązania nowego połączenia, jeŝeli kolejka jest pusta

Ustanawianie połączenia - klient int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); Konieczne dla gniazda strumieniowego nawiązuje połączenie z gniazdem strumieniowym serwera proces klienta jest blokowany do momentu ustanowienia połączenia tylko jedno pomyślne połączenie MoŜliwe dla gniazda datagramowego zapamiętuje adres partnera komunikacji datagramy będą wysyłane i odbierane wyłącznie z tego adresu moŝna powtarzać wielokrotnie

Przesyłanie danych Klient i serwer protokołu połączeniowego funkcje interfejsu plików: read(), write() Klient i serwer protokołu bezpołączeniowego przesyłają datagramy wymagają podania adresu odbiorcy

Przesyłanie datagramów int sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);

Likwidacja połączenia i zamykanie gniazda int close(int fd); int shutdown(int s, int how); how = 0 how = 1 how = 2 - zabrania dalszego przyjmowania danych, - zabrania dalszego wysyłania danych, - zabrania zarówno przyjmowania jak i wysyłania danych

Pobieranie adresów int getsockname(int s, struct sockaddr *name, socklen_t *namelen); Pobiera adres związany z lokalnym gniazdem int getpeername(int s, struct sockaddr *name, socklen_t *namelen); Pobiera adres związany ze zdalnym gniazdem połączonego partnera komunikacji

Odwzorowanie nazw na adresy struct hostent *gethostbyname(const char *name); struct hostent *gethostbyaddr(const char *addr, int len, int type); struct hostent { char *h_name; - nazwa hosta char **h_aliases; - lista aliasów int h_addrtype; - typ adresu int h_length; - długość adresu char **h_addr_list; - lista adresów

Przykład 1 serwer iteracyjny Serwer iteracyjny protokołu datagramowego w dziedzinie Internetu /*ustalenie portu usługi*/ #define SERVER_PORT 5500 #define MAX 80 main(int argc, char *argv[]) { int fd, newfd, pid, serverlength, clientlength; struct sockaddr_in clientaddr, serveraddr, caddr; char buf[max]="\0", *addr; /*tworzenie gniazda*/ if ((fd = socket(af_inet,sock_dgram,0)) == -1) { perror("blad socket"); exit(1);

Przykład 1 serwer c.d. /*wypełnienie struktury adresowej serwera*/ bzero((char*) &serveraddr,sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = htonl(inaddr_any); serveraddr.sin_port = htons(server_port); serverlength = sizeof(serveraddr); /*przydzielenie lokalnego adresu serwera*/ if ( bind(fd, (struct sockaddr *) &serveraddr, serverlength) == -1) { perror("blad bind"); exit(1);

Przykład 1 serwer c.d. for (;;){ clientlength = sizeof(clientaddr); /*oczekiwanie na nadejście datagramu*/ if ( recvfrom(fd, buf, MAX, 0, (struct sockaddr *) &clientaddr, &clientlength) == -1) { perror("blad recvfrom"); exit(1); /*wypisanie adresu klienta i wiadomości*/ addr = inet_ntoa(clientaddr.sin_addr); printf("\n%s\t%s\n", addr, buf);

Przykład 1 - klient Klient protokołu datagramowego w dziedzinie Internetu /*ustalenie portu usługi*/ #define SERVER_PORT 5500 #define MAX 80 main(int argc, char *argv[]) { int fd, serverlength, n; struct sockaddr_in serveraddr, clientaddr; char buf[max]="\0"; if (argc!= 3){ fprintf(stderr, "Poprawne wywolanie: %s adres wiadomosc\n", argv[0]); exit(1);

Przykład 1 klient c.d. /*tworzenie gniazda*/ if ((fd = socket(af_inet, SOCK_DGRAM, 0)) == -1) { perror("blad socket"); exit(1); /*wypełnienie struktury adresowej klienta*/ bzero((char*) &clientaddr, sizeof(clientaddr)); clientaddr.sin_family = AF_INET; clientaddr.sin_port = htons(0); clientaddr.sin_addr.s_addr = htonl(inaddr_any); /*przydzielenie lokalnego adresu klienta*/ if ( bind(fd, (struct sockaddr *) &clientaddr, sizeof(clientaddr)) == -1) { perror("blad bind"); exit(1);

Przykład 1 klient c.d. /*przepisanie wiadomości do bufora*/ strcpy(buf, argv[2]); n = strlen(buf); /*wypełnienie struktury adresowej serwera*/ bzero((char*) &serveraddr, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(server_port); serveraddr.sin_addr.s_addr = inet_addr(argv[1]); /*wysłanie datagramu*/ sendto(fd, buf, MAX, 0,(struct sockaddr *)&serveraddr, sizeof(serveraddr)); /*zamknięcie gniazda*/ close(fd); exit(0);

Przykład 2 serwer współbieŝny Serwer współbieŝny protokołu strumieniowego w dziedzinie Unix-a /*adres serwera*/ #define UNIX_PATH "./socket1.tmp" #define MAX 80 main(int argc, char *argv[]) { int fd, newfd, pid, serverlength, clientlength; struct sockaddr_un clientaddr, serveraddr; char buf[max]="\0"; /*tworzenie gniazda*/ if ((fd = socket(af_unix, SOCK_STREAM, 0)) == -1) { perror("blad socket"); exit(1);

Przykład 2 serwer c.d /*wypełnienie struktury adresowej serwera*/ bzero((char*) &serveraddr, sizeof(serveraddr)); serveraddr.sun_family = AF_UNIX; strcpy(serveraddr.sun_path, UNIX_PATH); serverlength = strlen(serveraddr.sun_path) + sizeof(serveraddr.sun_family); /*przydzielenie lokalnego adresu serwera*/ if (bind(fd, (struct sockaddr*)&serveraddr, serverlength) == -1) { perror("blad bind"); exit(1); /*zgloszenie gotowości odbierania połączeń*/ listen(fd, 5);

Przykład 2 serwer c.d. for (;;) { clientlength = sizeof(clientaddr); /*oczekiwanie na polaczenie klienta*/ if ((newfd = accept(fd,(struct sockaddr*)&clientaddr, &clientlength)) == -1) { perror("blad accept"); exit(1); /*utworzenie procesu potomnego*/ if ((pid = fork()) == -1) { perror("blad fork"); exit(1);

Przykład 2 serwer c.d. /*obsluga polaczenia przez proces potomny*/ else if (pid == 0) { close(fd); read(newfd, buf, MAX); printf("\n%s %s\n", clientaddr.sun_path, buf); exit(0); close(newfd);

Przykład 2 klient Klient protokołu strumieniowego w dziedzinie Unix-a /*adres serwera*/ #define UNIX_PATH./socket1.tmp #define MAX 80 main(int argc, char *argv[]) { int fd, serverlength, n; struct sockaddr_un serveraddr; char buf[max]="\0"; if (argc!= 2) { fprintf(stderr, "Poprawne wywolanie: %s wiadomosc\n", argv[0]); exit(1);

Przykład 2 klient c.d. /*tworzenie gniazda*/ if ((fd = socket(af_unix, SOCK_STREAM, 0)) == -1) { perror("blad socket"); exit(1); /*wypełnienie struktury adresowej serwera*/ bzero((char*) &serveraddr, sizeof(serveraddr)); serveraddr.sun_family = AF_UNIX; strcpy(serveraddr.sun_path, UNIX_PATH); serverlength = strlen(serveraddr.sun_path) + sizeof(serveraddr.sun_family);

Przykład 2 klient c.d. /*nawiązanie połączenia z serwerem*/ if (connect(fd, (struct sockaddr *) &serveraddr, serverlength) == -1){ perror("blad connect"); exit(1); /*kopiowanie i wysyłanie danych*/ strcpy(buf, argv[1]); n = strlen(buf); write(fd, buf, n); close(fd); exit(0);