Unix: programowanie sieciowe

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

Adresy w sieciach komputerowych

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

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

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

Iteracyjny serwer TCP i aplikacja UDP

Programowanie sieciowe

TIN Techniki Internetowe zima

Programowanie sieciowe

Sieci komputerowe - Wstęp do intersieci, protokół IPv4

Model sieci OSI, protokoły sieciowe, adresy IP

DR INŻ. ROBERT WÓJCIK DR INŻ. JERZY DOMŻAŁ

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

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

Protokoły sieciowe - TCP/IP

Sieci dostępu do Internetu. Dr inż. Małgorzata Langer

Przykład aplikacji UDP

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

2. Interfejs gniazd Gniazdo

Komunikacja sieciowa - interfejs gniazd

Programowanie Sieciowe 1

Warstwa sieciowa. Model OSI Model TCP/IP. Aplikacji. Aplikacji. Prezentacji. Sesji. Transportowa. Transportowa

Sieci komputerowe - Protokoły warstwy transportowej

Sieci komputerowe. Wykład 3: Protokół IP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski. Sieci komputerowe (II UWr) Wykład 3 1 / 25

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

Sieci komputerowe. Tadeusz Kobus, Maciej Kokociński Instytut Informatyki, Politechnika Poznańska

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

Funkcje systemu Unix

Systemy operacyjne i sieci komputerowe Szymon Wilk Adresowanie w sieciach Klasy adresów IP a) klasa A

MODEL WARSTWOWY PROTOKOŁY TCP/IP

Internet Control Message Protocol (ICMP) Łukasz Trzciałkowski

DR INŻ. ROBERT WÓJCIK DR INŻ. JERZY DOMŻAŁ

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

Adresy IP v.6 IP version 4 IP version 6 byte 0 byte 1 byte 2 byte 3 byte 0 byte 1 byte 2 byte 3

Przewodowe sieci dostępu do. Dr inż. Małgorzata Langer

Plan wykładu. Warstwa sieci. Po co adresacja w warstwie sieci? Warstwa sieci

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

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

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

Gniazda BSD. komunikacja bezpołączeniowa

Sieci komputerowe. Wykład 3: Protokół IP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski. Sieci komputerowe (II UWr) Wykład 3 1 / 24

Krótkie wprowadzenie do korzystania z OpenSSL

Testy penetracyjne Przykłady programów

Plan wykładu. Warstwa sieci. Po co adresacja w warstwie sieci? Warstwa sieci

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

Aby lepiej zrozumieć działanie adresów przedstawmy uproszczony schemat pakietów IP podróżujących w sieci.

Klasy adresów IP. Model ISO - OSI. Subnetting. OSI packet encapsulation. w.aplikacji w.prezentacji w.sesji w.transportowa w.

Protokół DHCP. Patryk Czarnik. Bezpieczeństwo sieci komputerowych MSUI 2009/10. Wydział Matematyki, Informatyki i Mechaniki Uniwersytet Warszawski

Bazy Danych i Usługi Sieciowe

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.

Zestaw ten opiera się na pakietach co oznacza, że dane podczas wysyłania są dzielone na niewielkie porcje. Wojciech Śleziak

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

Akademickie Centrum Informatyki PS. Wydział Informatyki PS

Podstawowe protokoły transportowe stosowane w sieciach IP cz.1

Programowanie przy użyciu gniazdek

Charakterystyka grupy protokołów TCP/IP

Plan wykładu. Wyznaczanie tras. Podsieci liczba urządzeń w klasie C. Funkcje warstwy sieciowej

Podstawowe typy serwerów

Architektura typu klient serwer: uproszczony klient POP3

Sieć komputerowa Adresy sprzętowe Adresy logiczne System adresacji IP (wersja IPv4)

Sieci komputerowe. Wykład dla studentów Informatyki Stosowanej i Fizyki Komputerowej UJ 2007/2008. Michał Cieśla

Laboratorium Sieci Komputerowe

Oprogramowanie komunikacyjne dla Internetu rzeczy Laboratorium nr 4 komunikacja unicastowa IPv6

IPv6 Protokół następnej generacji

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

Omówienie TCP/IP. Historia

Wirtualne sieci prywatne

Komunikacja w sieciach komputerowych

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

OSI Transport Layer. Network Fundamentals Chapter 4. Version Cisco Systems, Inc. All rights reserved. Cisco Public 1

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

Sieci komputerowe Warstwa sieci i warstwa transportowa

Sieci Komputerowe Modele warstwowe sieci

JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA. Marcin Lewandowski [ mlew@ippt.gov.pl ]

MASKI SIECIOWE W IPv4

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

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

Połączenie sieci w intersieci ( internet ) Intersieci oparte o IP Internet

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

Architektura INTERNET

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

Model warstwowy Warstwa fizyczna Warstwa łacza danych Warstwa sieciowa Warstwa transportowa Warstwa aplikacj. Protokoły sieciowe

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

Programowanie Sieciowe 1

Instrukcja konfiguracji usługi Wirtualnej Sieci Prywatnej w systemie Mac OSX

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

Zastosowania sieci komputerowych

Instalacja i konfiguracja rouera ASMAX AR 904u. Neostrada, Netia

Pobieranie argumentów wiersza polecenia

ZASADY PODZIAŁU SIECI NA PODSIECI, OBLICZANIA ADRESÓW PODSIECI, ADRESÓW HOSTÓW I ADRESU ROZGŁOSZENIOWEGO

Stos TCP/IP Warstwa Internetu. Sieci komputerowe Wykład 4

Gniazda. S. Samolej: Gniazda 1

Internet Protocol v6 - w czym tkwi problem?

Sieciowa komunikacja procesów - XDR i RPC

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

Zaawansowana adresacja IPv4

Sieci komputerowe. Tadeusz Kobus, Maciej Kokociński Instytut Informatyki, Politechnika Poznańska

Na podstawie: Kirch O., Dawson T. 2000: LINUX podręcznik administratora sieci. Wydawnictwo RM, Warszawa. FILTROWANIE IP

Zadania z sieci Rozwiązanie

Instytut Teleinformatyki

Transkrypt:

Unix: programowanie sieciowe Witold Paluszyński witoldp@pwr.wroc.pl http://sequoia.ict.pwr.wroc.pl/ witold/ Copyright c 1999,2004 Witold Paluszyński All rights reserved. Niniejszy dokument zawiera materia ly do wyk ladu na temat programowania sieciowego w systemie Unix. Jest on udostepniony pod warunkiem wykorzystania wy l acznie do w lasnych, prywatnych potrzeb i może być kopiowany wy l acznie w ca lości, razem z niniejsza strona tytu low a.

Warstwowy model sieci ISO-OSI Warstwa Warstwa aplikacji zapewnia określone us lugi sieciowe dla użytkownika aplikacji prezentacji sesji transportowa sieciowa po l aczeniowa zapewnia reprezentacje danych (format,kompresja,szyfrowanie) zapewnia otwieranie i zamykanie sesji oraz organizacje dialogu zapewnia niezawodny transport danych m-y dwoma systemami przesy lanie danych do określonego komputera (zawodne) przesy lanie danych do komputera w sieci lokalnej prezentacji sesji transportowa sieciowa po l aczeniowa fizyczna fizyczna po l aczenie fizyczne Unix: programowanie sieciowe 3

Model ISO a protoko ly internetowe Warstwy modelu ISO Protoko ly internetowe Funkcja aplikacji prezentacji aplikacji sesji transportowa sieciowa po l aczeniowa fizyczna TCP, UDP,... IP, ICMP IPv6, ICMPv6 systemowy driver karta sieciowa inny sprzet sieciowy interface gniazdek dostarczanie danych w trybie po l aczeniowym lub bezpo l aczeniowym pod określony adres (komputer+port) znajdowanie ścieżek sieciowych, przekazywanie pakietów do w laściwego adresu lokalnego, funkcje kontrolne Unix: programowanie sieciowe 4

Diagram stanów protoko lu TCP starting point CLOSED appl: passive open send: <nothing> timeout send: RST recv: RST recv: SYN; send: SYN, ACK LISTEN passive open appl: active open send: SYN appl: send data send: SYN SYN_RCVD recv: ACK send: <nothing> recv: SYN send: SYN, ACK simultaneous open recv: SYN, ACK send: ACK SYN_SENT active open appl: close or timeout appl: close send: FIN ESTABLISHED data transfer state recv: FIN send: ACK CLOSE_WAIT appl: close send: FIN appl: close send: FIN FIN_WAIT_1 recv: FIN send: ACK simultaneous close CLOSING LAST_ACK recv: ACK send: <nothing> recv: ACK send: <nothing> recv: FIN, ACK send: ACK recv: ACK send: <nothing> passive close FIN_WAIT_2 recv: FIN send: ACK active close TIME_WAIT 2MSL timeout appl: recv: send: normal transitions for client normal transitions for server state transitions taken when application issues operation state transitions taken when segment received what is sent for this transition TCP state transition diagram. Unix: programowanie sieciowe 5

Nag lówki pakietów TCP, UDP i IP IP Header 0 15 16 31 4-bit 4-bit header 8-bit type of service 16-bit total length (in bytes) version length (TOS) 8-bit time to live (TTL) 16-bit identification 8-bit protocol 0 D F M F 32-bit source IP address 13-bit fragment offset 16-bit header checksum 20 bytes 32-bit destination IP address options (if any) data UDP Header 0 15 16 31 16-bit source port number 16-bit destination port number 8bytes 16-bit UDP length 16-bit UDP checksum data (if any) TCP Header 0 15 16 31 16-bit source port number 16-bit destination port number 32-bit sequence number 32-bit acknowledgment number 20 bytes 4-bit header length reserved (6 bits) U RG A CK P SH R ST S YN F IN 16-bit window size 16-bit TCP checksum 16-bit urgent pointer options (if any) data (if any) Unix: programowanie sieciowe 6

Interface gniazdek Gniazdka uniwersalny interface do mechanizmów komunikacji miedzyprocesowej pozwalajacy na dwukierunkowa komunikacje procesów, nawet miedzy różnymi komputerami. Gniazdko stanowi deskryptor pliku reprezentujacy koniec rury (a raczej dziury ), który po pod l aczeniu gdzieś drugiego końca można zapisywać i/lub odczytywać. Komunikaty wrzucone do dziury wypadaja drugim końcem, ale nie na pewno i niekoniecznie we w laściwej kolejności albo bez b l edów. Gniazdka typu SOCK_STREAM: komunikacja w modelu po l aczeniowym zwykle zwiazana z protoko lem TCP warstwy transportowej (analogia: komunikacja telefoniczna). Gniazdka typu SOCK_DGRAM: komunikacja w modelu bezpo l aczeniowym zwykle zwiazana z protoko lem UDP warstwy transportowej (analogia: komunikacja listowa). Gniazdka typu SOCK_RAW: komunikacja na niskim poziomie, wy l acznie bezpo l aczeniowa zwykle zwiazana z protoko lem IP warstwy sieciowej, a także komunikaty kontrolne protoko lu ICMP. Unix: programowanie sieciowe 7

Adresowanie w sieci Internet 32-bitowe (4-oktetowe) adresy IP wersji 4, stosowane od 1.I.1983 klasa A: pierwszy oktet jest adresem sieci (a pozosta le trzy adresem komputera), z czego pierwszy bit jest zerem; możliwe 128 takich sieci (przedzia l 0-127) i 16 milionow komputerów w każdej klasa B: pierwsze dwa oktety sa adresem sieci (a dwa adresem komputera), z czego pierwsze dwa bity sa 10; możliwe 16 tysiecy adresów sieci (przedzia l 128-191) po 65 tysiecy komputerów klasa C: pierwsze trzy oktety sa adresem sieci (a jeden adresem komputera), z czego pierwsze trzy bity sa 110; możliwe dwa miliony takich sieci (przedzia l 192-223) i 256 komputerów w każdej klasa D: ca ly adres jest jednym adresem, ale cztery pierwsze bity musza być 1110; adresy te stosuje sie do komunikacji multicast adresy broadcast: same jedynki lub same zera w adresie komputera adresy prywatne: 10.0.0.0 10.255.255.255 172.16.0.0 172.31.255.255 192.168.0.0 192.168.255.255 Unix: programowanie sieciowe 8

Adresowanie bezklasowe Przydzielanie adresów IP wed lug schematu pieciu klas jest nieefektywne; pomimo iż istnieje ponad 4 miliardy liczb 32-bitowych już w po lowie lat 90-tych zacze lo brakować adresów IP. Ponadto, dowolność w przydzielaniu pojedynczych adresów sieci powodowa la przepe lnienie globalnych routerów zobowiazanych do odnajdowania ścieżki prowadzacej do każdej sieci. Dla rozwiazania tych problemów wprowadzono tzw. system CIDR (classless inter-domain routing). Odrzuca on sztywny podzia l adresu na sieć i komputer, oraz wprowadza agregacje bloków adresów sieci. Obecnie dowolny adres sk lada sie z prefixu (pierwszej cześci) dowolnej d lugości stanowiacego adres sieci, i reszty stanowiacej adres komputera. Dla wskazania d lugości prefixu stosuje sie notacje x.y.z.t/p. Na przyk lad, 156.17.9.0/25 oznacza adres sieci, w którym 25 bitów stanowi adres sieci, a pozosta lych 7 adres komputera. Oznacza to, że może być 128 adresów w tej sieci, z których pierwszy (same zera w cz eści adresu komputera) jest adresem sieci, a ostatni (same jedynki w cz eści adresu komputera) jest adresem rozg laszania (broadcast), co pozostawia 126 rzeczywistych adresów. Unix: programowanie sieciowe 9

Adresowanie z podsieciami Schemat adresowania: nr-sieci/nr-komputera pozwala przydzielać organizacji pule adresów jako ca l a sieć. Jednak czesto użytkownicy adresów sieciowych sami chca wydzielać sobie mniejsze sieci (podsieci) dla usprawnienia swojej w lasnej infrastruktury sieciowej. Dlatego jest możliwe traktowanie dowolnej poczatkowej cześci adresu komputera jako rozszerzenia adresu sieci (adresu podsieci), a reszty jako adresu komputera. Na przyk lad: adres sieci 156.17.9.0/25, albo 156.17.9/25, w rzeczywistości sk lada si e z adresu sieci 156.17.9.0/24 przydzielanej jednostkom Politechniki Wroc lawskiej, i jednobitowego adresu podsieci (o wartości 0). Dla odmiany, 156.17.9.128/25 nie jest adresem drugiej takiej samej sieci, ponieważ te adresy zosta ly podzielone na podsieci inaczej, z trzybitowym adresem podsieci, po 30 rzeczywistych adresów komputerów w każdej. Adresami tych sieci sa wiec: 156.17.9.128/27, 156.17.9.160/27, 156.17.9.192/27, 156.17.9.224/27. Maska podsieci jest adres, w którym wszystkie bity adresu sieci sa jedynkami, a bity adresu komputera zerami. Maska podsieci 156.17.9/25 jest 255.255.255.128, albo ffffff80, a posieci 156.17.9.128/27, jak i pozosta lych trzech powyższych podsieci, jest 255.255.255.224, albo ffffffe0. Unix: programowanie sieciowe 10

Adresy symboliczne Dla wygody wprowadzono dualna przestrzeń adresów adresy symboliczne. Sa one zorganizowane w hierarchiczna strukture tzw. domen adresowych. Struktura ta nie ma ograniczeń; domeny po lożone niżej w hierarchii sa w lasnościa różnych organizacji, które same dostarczaja informacji o domenach w nich zawartych. Np.: komputer sequoia.ict.pwr.wroc.pl (IP:156.17.9.3) należy do domeny ict.pwr.wroc.pl, która jest w lasnościa Instytutu Cybernetyki Technicznej Politechniki Wroc lawskiej, i która otrzyma la prawa do tej domeny od Politechniki Wroc lawskiej, w laściciela domeny pwr.wroc.pl. Przestrzeń adresów symbolicznych s luży tylko wygodzie ludzkiej pamieci, i istnieje odwzorowanie adresów symbolicznych na adresy numeryczne. Do realizacji tego odwzorowania s luży specjalny system DNS (domain name system) sk ladajacy sie z sieci serwerów wymieniajacych informacje o tych odwzorowaniach i serwujacych te informacje na życzenie. Unix: programowanie sieciowe 11

Adresy IP interface ów Komputer może posiadać wiecej niż jedna karte sieciowa (tzw. interface sieciowy), które moga być pod l aczone do różnych sieci lub do tej samej sieci. W obu przypadkach obie karty sieciowe powinny funkcjonować niezależnie i mieć oddzielne adresy IP. W pierwszym przypadku (dwie różne sieci) komputer może, ale nie musi, pe lnić role l acznika, tzw, routera przekazujacego ruch miedzy tymi sieciami. Czesto jednak taki komputer posiada tylko jeden adres symboliczny. Np. komputer tahoe.ict.pwr.wroc.pl ma dwie karty sieciowe o adresach 156.17.9.16 i 156.17.30.103 i jest routerem miedzy siecia Robotyki 156.17.9/25 a siecia g lówna ICT 156.17.30.96/27. Adres 127.0.0.1 (symbol INADDR_LOOPBACK) jest na mocy konwencji przypisany na każdym komputerze virtualnemu interface-owi loopback, który jest programowa implementacja po l aczenia sieciowego komputera z samym soba. Adres 0.0.0.0 (symbol INADDR_ANY) jest również czasami używany jako tzw. adres wild-card. Unix: programowanie sieciowe 12

Adresowanie inne zagadnienia adresy niskiego poziomu w sieciach lokalnych Sa to tzw. adresy MAC, medium access control unikalne 6-bajtowe adresy przydzielane na sta le urzadzeniom sieciowym (patent firmy Xerox dla sieci Ethernet, stosowany również w innych technologiach sieciowych, np. token ring). 2 48 2.8 10 14 adresów co daje ok. 28 tysi ecy adresów na każdego mieszkańca planety adresy IP wersji 6 (IPv6) Jest to nowa wersja systemu adresów internetowych z nowa wersja protoko lu IP warstwy sieciowej. Adresy IPv6 sa 128-bitowe i zawieraja w sobie adresy MAC (a raczej ich 64-bitowe uogólnienie: EUI-64). Unix: programowanie sieciowe 13

Routing Routing jest czynnościa określania lokalizacji sieci komputerowej na podstawie jej adresu. Lokalizacje rozumiemy tu w sensie po l aczeń, to znaczy znalezienie ścieżki sieciowej (szeregu po l aczonych routerów), prowadzacej do lokalizowanej sieci. Realizacja tej czynności opiera sie na zwiazku prefixu adresu sieci z fizyczna lokalizacja sieci. Informacje wymieniane miedzy komputerami znajdujacymi ścieżki (routerami) pozwalaja im na określanie tych ścieżek przez abstrakcje. Algorytm routera: jeśli adres jest w mojej podsieci to doreczam pakiet komu trzeba, jeśli jest w jednej z podsieci do l aczonej do mojej, lub znam na pamieć ścieżke do tej podsieci z obs lugujacym ja routerem to jemu przekazuje pakiet, w przeciwnym wypadku przekazuje pakiet routerowi obs lugujacemu ruch na zewn atrz mojej podsieci; może to ja sam jestem takim routerem, w tym przypadku posiadam drugie po l aczenie z kimś kto obs luguje ruch wychodzacy z mojej podsieci. Unix: programowanie sieciowe 14

Komunikacja klient-serwer Pakiety sieciowe z konieczności odbiera system operacyjny, który nastepnie stwierdza dla kogo pakiet jest przeznaczony. Pakiety adresowane sa tzw. numerami portów. Numery portów moga być zwiazane z gniazdkami otwartymi przez procesy już po nawiazaniu komunikacji, albo otwartymi w celu oczekiwania na zg loszenie klienta. Wiekszość komunikacji sieciowej odbywa sie w trybie klient-serwer. Istnieja dobrze-znane us lugi sieciowe, obs lugiwane pod oficjalnymi numerami portów przez serwery, które rejestruja swoje us lugi w systemie (zwiazuj a gniazdko z adresem-numerem portu funkcja bind), nastepnie oczekuja na nadejście zg loszenia, odbieraja je od systemu operacyjnego, i przystepuj a do ich obs lużenia majac jednocześnie na uwadze możliwość nadejścia nastepnych zg loszeń. ftp-data 20/tcp ftp 21/tcp smtp 25/tcp mail http 80/tcp www www-http http 80/udp www www-http sunrpc 111/udp rpcbind sunrpc 111/tcp rpcbind Procesy pragnace nawiazać symetryczna komunikacje sieciowa (tzn. nie w Unix: programowanie sieciowe 15

trybie klient-serwer) również musza zainicjować komunikacje za pośrednictwem zdalnego systemu. Jeden z partnerów musi zarejestrować sie jak serwer, i oczekiwać na zg loszenie sie partnera może przejść do komunikacji symetrycznej zgodnie ze swoim protoko lem. Jeszcze inny model komunikacji stanowi zdalne wywo lywanie procedur (remote procedure calling, RPC). Proces wywo lywania zdalnej procedury rozpoczyna sie od kontaktu ze zdalnym serwerem pośredniczacym (brokera), który umożliwia komunikacje z w laściwym serwerem, który oblicza wartość funkcji dla przys lanych wartości argumentów. Unix: programowanie sieciowe 16

#include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <netdb.h> #include <stdio.h> Uzyskiwanie informacji o adresie int main(int argc, char *argv[]) { char *host, **names, **addrs; struct hostent *hostinfo; if (argc == 1) { char myname[256]; gethostname(myname, 255); host = myname; else host = argv[1]; hostinfo = gethostbyname(host); if (!hostinfo) { fprintf(stderr, "brak translacji adresu dla: %s\n", host); exit(1); printf("wyniki dla adresu symbolicznego %s:\n", host); Unix: programowanie sieciowe 17

printf("nazwa: %s\n", hostinfo -> h_name); printf("aliasy:"); names = hostinfo -> h_aliases; while(*names) { printf(" %s", *names); names++; printf("\n"); if (hostinfo -> h_addrtype!= AF_INET) { fprintf(stderr, "Hmm, nie jest to adres internetowy!\n"); exit(1); addrs = hostinfo -> h_addr_list; while (*addrs) { printf(" %s", inet_ntoa(*(struct in_addr *)*addrs)); addrs++; printf("\n"); exit(0); Unix: programowanie sieciowe 18

* This program creates a datagram socket, binds a name to it, then reads * from t #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> /* In the included file <netinet/in.h> a sockaddr_in is defined as follows: * struct sockaddr_in { * short sin_family; * u_short sin_port; * struct in_addr sin_addr; * char sin_zero[8]; * ; */ main() { int sock, length; struct sockaddr_in name; char buf[1024]; /* Create socket from which to read. */ sock = socket(pf_inet, SOCK_DGRAM, 0); if (sock < 0) { perror("opening datagram socket"); exit(1); Unix: programowanie sieciowe 19

/* Create name with wildcards. */ name.sin_family = AF_INET; name.sin_addr.s_addr = INADDR_ANY; name.sin_port = 0; if (bind(sock, &name, sizeof(name))) { perror("binding datagram socket"); exit(1); /* Find assigned port value and print it out. */ length = sizeof(name); if (getsockname(sock, &name, &length)) { perror("getting socket name"); exit(1); printf("socket has port #%d\n", ntohs(name.sin_port)); /* Read from the socket */ if (read(sock, buf, 1024) < 0) perror("receiving datagram packet"); printf("-->%s\n", buf); close(sock); Unix: programowanie sieciowe 20

#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #define DATA "The sea is calm tonight, the tide is full..." main(int argc, char *argv[]) { int sock; struct sockaddr_in name; struct hostent *hp, *gethostbyname(); /* Create socket on which to send. */ sock = socket(pf_inet, SOCK_DGRAM, 0); if (sock < 0) { perror("opening datagram socket"); exit(1); /* Unix: programowanie sieciowe 21

* Construct name, with no wildcards, of the socket to send to. * Gethostbyname() returns a structure including the network address * of the specified host. The port number is taken from the command * line. */ hp = gethostbyname(argv[1]); if (hp == 0) { fprintf(stderr, "%s: unknown host\n", argv[1]); exit(2); memcpy(&name.sin_addr, hp->h_addr, hp->h_length); name.sin_family = AF_INET; name.sin_port = htons(atoi(argv[2])); /* Send message. */ if (sendto(sock, DATA, sizeof(data), 0, &name, sizeof(name)) < 0) perror("sending datagram message"); close(sock); Unix: programowanie sieciowe 22

#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #define DATA "Half a league, half a league..." /* * This program creates a socket and initiates a connection with the socket * given in the command line. One message is sent over the connection and * then the socket is closed, ending the connection. The form of the command * line is streamwrite hostname portnumber */ main(int argc, char *argv[]) { int sock; struct sockaddr_in server; struct hostent *hp, *gethostbyname(); char buf[1024]; /* Create socket */ Unix: programowanie sieciowe 23

sock = socket(pf_inet, SOCK_STREAM, 0); if (sock < 0) { perror("opening stream socket"); exit(1); /* Connect socket using name specified by command line. */ server.sin_family = AF_INET; hp = gethostbyname(argv[1]); if (hp == 0) { fprintf(stderr, "%s: unknown host\n", argv[1]); exit(2); memcpy(&server.sin_addr, hp->h_addr, hp->h_length); server.sin_port = htons(atoi(argv[2])); if (connect(sock, &server, sizeof(server)) < 0) { perror("connecting stream socket"); exit(1); if (write(sock, DATA, sizeof(data)) < 0) perror("writing on stream socket"); close(sock); Unix: programowanie sieciowe 24

#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #define TRUE 1 /* * This program creates a socket and then begins an infinite loop. Each time * through the loop it accepts a connection and prints out messages from it. * When the connection breaks, or a termination message comes through, the * program accepts a new connection. */ main() { int sock, length; struct sockaddr_in server; int msgsock; char buf[1024]; int rval; Unix: programowanie sieciowe 25

int i; /* Create socket */ sock = socket(pf_inet, SOCK_STREAM, 0); if (sock < 0) { perror("opening stream socket"); exit(1); /* Name socket using wildcards */ server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = 0; if (bind(sock, &server, sizeof(server))) { perror("binding stream socket"); exit(1); /* Find out assigned port number and print it out */ length = sizeof(server); if (getsockname(sock, &server, &length)) { perror("getting socket name"); exit(1); printf("socket has port #%d\n", ntohs(server.sin_port)); /* Start accepting connections */ Unix: programowanie sieciowe 26

listen(sock, 5); do { msgsock = accept(sock, 0, 0); if (msgsock == -1) perror("accept"); else do { memset(buf, 0, sizeof(buf)); if ((rval = read(msgsock, buf, 1024)) < 0) perror("reading stream message"); i = 0; if (rval == 0) printf("ending connection\n"); else printf("-->%s\n", buf); while (rval!= 0); close(msgsock); while (TRUE); /* * Since this program has an infinite loop, the socket "sock" is * never explicitly closed. However, all sockets will be closed * automatically when a process is killed or terminates normally. */ Unix: programowanie sieciowe 27

#include <sys/types.h> #include <sys/socket.h> #include <sys/time.h> #include <netinet/in.h> #include <sys/select.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #define TRUE 1 /* * This program uses select() to check that someone is trying to connect * before calling accept(). */ main() { int sock, length; struct sockaddr_in server; int msgsock; char buf[1024]; int rval; Unix: programowanie sieciowe 28

fd_set ready; struct timeval to; /* Create socket */ sock = socket(af_inet, SOCK_STREAM, 0); if (sock < 0) { perror("opening stream socket"); exit(1); /* Name socket using wildcards */ server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = 0; if (bind(sock, &server, sizeof(server))) { perror("binding stream socket"); exit(1); /* Find out assigned port number and print it out */ length = sizeof(server); if (getsockname(sock, &server, &length)) { perror("getting socket name"); exit(1); printf("socket has port #%d\n", ntohs(server.sin_port)); Unix: programowanie sieciowe 29

/* Start accepting connections */ listen(sock, 5); do { FD_ZERO(&ready); FD_SET(sock, &ready); to.tv_sec = 5; if (select(sock + 1, &ready, 0, 0, &to) < 0) { perror("select"); continue; if (FD_ISSET(sock, &ready)) { msgsock = accept(sock, (struct sockaddr *)0, (int *)0); if (msgsock == -1) perror("accept"); else do { memset(buf, 0, sizeof(buf)); if ((rval = read(msgsock, buf, 1024)) < 0) perror("reading stream message"); else if (rval == 0) printf("ending connection\n"); else printf("-->%s\n", buf); while (rval > 0); close(msgsock); else Unix: programowanie sieciowe 30

printf("do something else\n"); while (TRUE); Unix: programowanie sieciowe 31