Programowanie z wykorzystaniem gniazd



Podobne dokumenty
Protokół UDP UDP (User Datagram Protocol) . [

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

Usługa TIME. 77 8A. Usługa jest dostępna zarówno za pośrednictwem TCP i UDP

Podstawowe typy serwerów

Podstawowe typy serwerów

Serwer współbieżny połączeniowy

Przykłady interfejsu TCP i UDP w Javie

JAVA I SIECI. MATERIAŁY:

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

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

Gniazda BSD. komunikacja bezpołączeniowa

Gniazda BSD implementacja w C#

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

Krótkie wprowadzenie do korzystania z OpenSSL

Architektura typu klient serwer: uproszczony klient POP3

Java a dost p do Internetu.

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

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

Programowanie Sieciowe 1

Programowanie przy użyciu gniazdek

Programowanie w języku Java

Programowanie współbieżne i rozproszone

Java programowanie w sieci. java.net RMI

Komunikacja sieciowa - interfejs gniazd

2. Interfejs gniazd Gniazdo

Obiekty sieciowe - gniazda Komputery w sieci Internet komunikują się ze sobą poprzez:

Iteracyjny serwer TCP i aplikacja UDP

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

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

Komunikacja z użyciem gniazd aplikacje klient-serwer

Programowanie sieciowe

Programowanie rozproszone w języku Java

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Schemat dla UDP. = możliwe zablokowanie aplikacji KLIENT SERWER. s=socket(...) bind(s,...) recvfrom(s,...) sendto(s,...) recvfrom(s,...

Programowanie aplikacji w architekturze Klient-Serwer - UDP

Serwery współbieżne c.d.

Aplikacja wielowątkowa prosty komunikator

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

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

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

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

1. Model klient-serwer

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

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

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

Aplikacja wielow tkowa prosty komunikator

Adresy URL. Zaawansowane technologie Javy 2019

Oprogramowanie komunikacyjne dla Internetu rzeczy Laboratorium nr 4 komunikacja unicastowa IPv6

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

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

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

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

Programowanie sieciowe

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

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

URL. Budowa URL (ang. Uniform Resource Locator): working#downloading

Platformy Programistyczne Zagadnienia sieciowe i wątki

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

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Gniazda komunikacji sieciowej w środowisku Java

Podejście obiektowe do budowy systemów rozproszonych

SOAP. Autor: Piotr Sobczak

Gniazda. S. Samolej: Gniazda 1

Networking. Zaawansowane technologie Javy 2019

Programowanie obiektowe

Tworzenie aplikacji rozproszonej w Sun RPC

Przykład aplikacji UDP

Java programowanie sieciowe

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Instytut Teleinformatyki

Kurs programowania. Wykład 10. Wojciech Macyna. 05 maja 2016

Interfejsy w Javie. Przykład zastosowania interfejsów:

Aplikacje RMI

Remote Method Invocation

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Programowanie obiektowe

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Wywoływanie metod zdalnych

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Wywoływanie metod zdalnych

SOAP i alternatywy. 1. WSDL. 2. Protokoły tekstowe XML-RPC. JSON-RPC. SOAPjr. 3. Protokoły binarne Google Protocol Bufers. Apache Thrift.

Programowanie w języku Java. Bazy danych SQLite w Javie

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Tworzenie i wykorzystanie usług

Remote Method Invocation 17 listopada 2010

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

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

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1

Język JAVA podstawy. Wykład 6, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Sieciowa komunikacja procesów - XDR i RPC

Pobieranie argumentów wiersza polecenia

4. Algorytmy klienta

Protokół HTTP. 1. Protokół HTTP, usługi www, model request-response (żądanie-odpowiedź), przekazywanie argumentów, AJAX.

Wykład 7: Pakiety i Interfejsy

Transkrypt:

Plan wykładu 1. Programowanie z wykorzystaniem gniazd usługa TIME, usługa ECHO, 2. Popularne aplikacje TCP/IP poczta elektroniczna cz. 1 protokół SMTP, 1

Programowanie z wykorzystaniem gniazd Utworzenie gniazda: int socket (int domain, int type, int protocol) domain rodzina protokołów używana do komunikacji w sieci, zdefniowana w pliku <sys/socket.h> np.: PF_UNIX, PF_LOCAL, PF_INET, PF_INET6, PF_IPX. type rodzaj komunikacji np.: SOCK_STREAM, SOCK_DGRAM, SOCK_RDM. protocol protokół transmisji wykorzystywany przez gniazdo. Wartość zwracana: deskryptor gniazda lub -1 w przypadku błędu. Pliki nagłówkowe <sys/socket.h>, <sys/types.h>. 2

Programowanie z wykorzystaniem gniazd Połączenie poprzez gniazdo: int connect (int sock, const struct sockaddr *serv_addr, int len) sock deskryptor gniazda uzyskany funkcją socket. serv_addr wskaźnik do struktury opisującej punk docelowy połączenia. len długość struktury wskazywanej przez serv_addr. Wartość zwracana: 0 w przypadku powodzenia, -1 w przypadku błędu. Pliki nagłówkowe <sys/socket.h>, <sys/types.h>. 3

Programowanie z wykorzystaniem gniazd Zamknięcie połączenia (gniazda): int shutdown (int sock, int how) sock deskryptor gniazda uzyskany funkcją socket. how sposób zamknięcia połączenia np.: SHUT_RD, SHUT_WR, SHUT_RDWR. Wartość zwracana: 0 w przypadku powodzenia, -1 w przypadku błędu. Pliki nagłówkowe <sys/socket.h>. 4

Programowanie z wykorzystaniem gniazd #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <errno.h> #include <string.h> int connectsock(char *host, char *service, char *protocol){ struct hostent *phe; struct servent *pse; struct protoent *ppe; struct sockaddr_in sin; int type, s; bzero((char*) &sin, sizeof(sin)); sin.sin_family = AF_INET; 5

Programowanie z wykorzystaniem gniazd if (pse = getservbyname(service, protocol)){ sin.sin_port = pse->s_port; else if ((sin.sin_port = htons((u_short)atoi(service)))==0){ fprintf(stderr, "nieznana usluga: %s\n", service); return -1; if (phe = gethostbyname(host)){ bcopy(phe->h_addr, (char *) &sin.sin_addr, phe->h_length); else if ((sin.sin_addr.s_addr = inet_addr(host))==inaddr_none){ fprintf(stderr, "nieznany host: %s\n", host); return -1; if ((ppe = getprotobyname(protocol))==null){ fprintf(stderr, "nieznany protokol: %s\n", protocol); return -1; 6

Programowanie z wykorzystaniem gniazd if (strcmp(protocol, "udp")==0){ type = SOCK_DGRAM; else{ type = SOCK_STREAM; if ((s = socket(pf_inet, type, ppe->p_proto))<0){ fprintf(stderr, "nieznany protokol: %s\n", protocol); return -1; if (connect(s, (struct sockaddr *)&sin, sizeof(sin))<0){ fprintf(stderr, "nie moge ustanowic polaczenia z %s:%s %s\n", host, service, strerror(errno)); return -1; return s; 7

Programowanie z wykorzystaniem gniazd #define LINELEN 100 int main(int argc, char **argv){ int s, n; char buf[linelen+1]; if (argc<4){ printf("sposob uzycia: client serwer serwis protokol\n"); return 0; s = connectsock(argv[1], argv[2], argv[3]); if(s<0) return 0; while ((n=read(s, buf, LINELEN))>0){ buf[n] = '\0'; fputs(buf, stdout); if (shutdown(s, SHUT_RDWR)<0){ fprintf(stderr, "problem z zamknieciem polaczenia: %s\n", strerror(errno)); return 0; return 1; 8

Programowanie z wykorzystaniem gniazd Przykładowe uruchomienie programu: client theta.uoks.uj.edu.pl daytime tcp Wynik działania: Tue Oct 14 15:27:25 2008 lista serwisów (usług, portów): /etc/services lista protokołów: /etc/protocols 9

Gniazda w Javie Pakiet (biblioteka): java.net Wybrane klasy: Socket reprezentuje gnaizdo wykorzystywane do transmisji strumieniowej (TCP), istnieje wersja do transmisji szyfrowanej SSLSocket; DatagramSocket gniazdo do transmisji datagramowej (UDP); InetAddress adres IP, istnieją dwie klasy potomne: Inet4Address i Inet6Address; URL Uniform Resource Locator, identyfkator zasobu w sieci opisujący sposób dostępu do niego np. http://www.if.uj.edu.pl/images/misc/ujlogo.gif, w ogólnym wypadku stosuje się klasę URI Uniform Resource Identyfcator. 10

Gniazda w Javie import java.io.inputstream; import java.net.socket; public class Client { private static final int LINELEN = 100; public static void main(string[] args) { byte[] buffer = new byte[client.linelen]; if (args.length<2) System.out.println("wywolanie java Client serwer port"); try { Socket sock = new Socket(args[0], Integer.parseInt(args[1])); InputStream in = sock.getinputstream(); while (in.read(buffer) > 0) System.out.println(new String(buffer)); sock.close(); catch (Exception e) { e.printstacktrace(); Wywołanie programu: javac Client.java java Client theta.uoks.uj.edu.pl 13 11

using System; using System.IO; using System.Net.Sockets; Gniazda w C# public class socketexample { public static void Main() { try { TcpClient tcpclnt = new TcpClient(); tcpclnt.connect("theta.uoks.uj.edu.pl",13); Stream stm = tcpclnt.getstream(); byte[] bb = new byte[100]; int k = stm.read(bb,0,100); for (int i = 0; i<k; i++) Console.Write(Convert.ToChar(bb[i])); tcpclnt.close(); catch (Exception e) { Console.WriteLine(e.StackTrace); Wywołanie programu: mcs socketexample.cs mint socketexample.exe lub mono socketexample.exe 12

Gniazda w Perlu i PHP Perl: use IO::Socket; my $sock = new IO::Socket::INET (PeerAddr => 'theta.uoks.uj.edu.pl', PeerPort => '13', Proto => 'tcp', ); die "Nie można utworzyc gniazda: $!\n" unless $sock; while(<$sock>) print $_; close($sock); PHP: <?php $socket = socket_create(af_inet, SOCK_STREAM, SOL_TCP); $result = socket_connect($socket, 'theta.uoks.uj.edu.pl', '13'); $out = socket_read($socket, 1024); echo $out; socket_close($socket);?> 13

Gniazda w Pythonie i Ruby Python: import socket s = socket.socket ( socket.af_inet, socket.sock_stream ) s.connect(("theta.uoks.uj.edu.pl", 13)) data = s.recv(1024) print data s.close() Ruby: require 'socket' print TCPSocket.open("theta.uoks.uj.edu.pl", "daytime").read 14

Usługa TIME Usługa TIME [RFC 868] służy do synchronizacji czasu pomiędzy komputerami w sieci. Czas jest przesyłany w postaci 32 bitowej liczby całkowitej określającej liczbę sekund od 1 stycznia 1900 roku np. C5 1B 77 8A. Usługa jest dostępna zarówno za pośrednictwem TCP i UDP poprzez port 37. Inne usługi wykorzystywane do synchronizacji czasu to NTP (Network Time Protocol) [RFC 1305] i jego odmiana SNTP (Simple Network Time Protocol) [RFC 1769]. 15

Klient usługi TIME (UDP) #include "connectsock.c" #define UNIXEPOCH 2208988800ul int main(int argc, char **argv){ int s; char msg[] = "ktora godzina?"; time_t now; if ((s = connectsock(argv[1], "time", "udp"))<0) return 0; write(s, msg, strlen(msg)); if (read(s, (char *)&now, sizeof(now))<0) return 0; else{ now = ntohl((u_long)now); now -= UNIXEPOCH; printf("%s\n", ctime(&now)); if (shutdown(s, SHUT_RDWR)<0) return 0; return 1; 16

Klient usługi TIME (UDP) import java.net.datagrampacket; import java.net.datagramsocket; import java.net.inetaddress; import java.util.date; public class TimeUDPClient { private static final int PORT_TIME = 37; private static final String QUERY = "Ktora godzina?"; private static final int LINELEN = 5; private static final long UNIXEPOCH = 2208988800L; public static void main(string[] args) { try { byte[] buffer = new byte[linelen]; DatagramSocket sock = new DatagramSocket(); DatagramPacket dp = new DatagramPacket( QUERY.getBytes(), 0, QUERY.length(), InetAddress.getByName(args[0]), PORT_TIME); 17

Klient usługi TIME (UDP) sock.send(dp); dp = new DatagramPacket(buffer, LINELEN); sock.receive(dp); long time = 0; int i; for (i=0; i<4; i++){ time *= 256; time += (buffer[i] & 255); time -= UNIXEPOCH; time *= 1000; Date d = new Date(time); System.out.println(d); sock.close(); catch (Exception e) { e.printstacktrace(); 18

Usługa NTP/SNTP Usługa NTP (Network Time Protocol) jest współcześnie wykorzystywana do synchronizacji czasu. NTP wykorzystuje protokół UDP oraz port 127. W praktyce, jeśli duża dokładność synchronizacji nie jest wymagana, używa się uproszczonej wersji protokołu: SNTP [RFC 2030]. Przykladowy pakiet wysyłany przez klienta: d9: 11 zegar niezsychronizowany 011 wersja protokołu NTP (3) 001 tryb aktywny symetryczny (1). Tryb klienta: 3 00: wartwa (stratum) komputera klienckiego: nieustalona 19

Usługa NTP/SNTP 0a: odstęp między kolejnymi wiadomościami: 2^10 sekund. fa: dokładność zegara: 2^(-6) sekundy. 00 00 00 00: opóźnienie względem źródła czasu: 0.0 (liczba zmiennoprzecinkowa ze znakiem - kropka pomiędzy bitem 15 i 16). 00 01 02 90: błąd względem źródła czasu 1.01 s. 20

Usługa NTP/SNTP 00 00 00 00: identyfkator zegara referencyjnego brak 00 00 00 00 00 00 00 00: czas ostatniej aktualizacji lokalnego zegara 00 00 00 00 00 00 00 00: czas w którym żądanie zostało wysłane 00 00 00 00 00 00 00 00: czas dotarcia żądania do serwera cc a8 03 c9 aa 25 88 4f: przesyłany czas liczba sekund od 1.01.1900, kropka pomiędzy bitem 31 i 32: 21

Usługa NTP/SNTP przykładowa odpowiedź serwera: 1a 01 0a e3 00 00 00 00 00 00 00 00 41 43 54 53 cc a8 04 2b 12 b4 49 7b cc a8 03 c9 aa 25 88 4f: cc a8 04 42 4d 12 73 fa: cc a8 04 42 4d 13 38 d7: czas otrzymany od klienta (T1) czas dotarcia żądania do serwera (T2) aktualny czas (T3) 22

Usługa NTP/SNTP Po odebraniu odpowiedzi od serwera, klient ustala aktualny czas w oparciu o: - czas wysłania żądania T1 (wg lokalnego zegara), - czas odebrania odpowiedzi przez serwer T2 (wg zegara serwera), - czas otrzymany z serwera T3 (wg zegara serwera) - czas otrzymania odpowiedzi T4 (wg lokalnego zegara) Różnicę czasów klient oblicza ze wzoru: T = ((T2 T1) + (T3 T4)) / 2. Opóźnienie wyraża się zależnością: D = (T4 T1) (T3 T2). 23

Usługa ECHO Usługa ECHO [RFC 347] odsyła klientowi wszystkie otrzymywane od niego dane. Interakcja trwa dopóki klient nie zakończy transmisji. Usługa ECHO jest wykorzystywana głównie do celów diagnostycznych, podobnie jak komenda ping. W przeciwieństwie do niej korzysta z protokołu TCP lub UDP. Do komunikacji wykorzystuje port 7. 24

Klient usługi ECHO (TCP) int main(int argc, char **argv){ int s, i, n1, n2; char buf[linelen+1]; if ((s = connectsock(argv[1], echo, tcp ))<0) return 0; for(i=2; i<argc; i++){ n1 = write(s, argv[i], strlen(argv[i])); while (n1>0 && (n2=read(s, buf, LINELEN))>0){ buf[n2] = '\0'; n1 -= n2; fputs(buf, stdout); fputs( \n, stdout); if (shutdown(s, SHUT_RDWR)<0) return 0; return 1; 25

Klient usługi ECHO (UDP) int main(int argc, char **argv){ int s, i, n; char buf[linelen+1]; if ((s = connectsock(argv[1], echo, udp ))<0) return 0; for(i=2; i<argc; i++){ write(s, argv[i], strlen(argv[i])); if ((n=read(s, buf, LINELEN))>0){ buf[n] = '\0'; fputs(buf, stdout); fputs( \n, stdout); if (shutdown(s, SHUT_RDWR)<0) return 0; return 1; 26

Klient usługi ECHO (TCP) import java.io.inputstream; import java.io.outputstream; import java.net.socket; public class EchoTCPClient { private static final int PORT_ECHO = 7; private static final int LINELEN = 100; public static void main(string[] args) { byte[] buffer = new byte[linelen]; if (args.length<2){ System.out.println("wywolanie java EchoTCPClient serwer argument1 argument2..."); return; 27

Klient usługi ECHO (TCP) try { Socket sock = new Socket(args[0], PORT_ECHO); OutputStream os = sock.getoutputstream(); InputStream in = sock.getinputstream(); int i, k, j; for (i=1; i<args.length; i++){ os.write(args[i].getbytes()); for(j=0; j<args[i].length(); j+=k){ k = in.read(buffer); System.out.print(new String(buffer, 0, k)); System.out.println(); sock.close(); catch (Exception e) { e.printstacktrace(); 28

Klient usługi ECHO (UDP) public class EchoUDPClient { private static final int PORT_ECHO = 7; private static final int LINELEN = 100; public static void main(string[] args) { try { byte[] buffer = new byte[linelen]; DatagramSocket sock = new DatagramSocket(); DatagramPacket dp; for (int i=1; i<args.length; i++){ dp = new DatagramPacket(args[i].getBytes(), 0, args[i].length(), InetAddress.getByName(args[0]), PORT_ECHO); sock.send(dp); dp = new DatagramPacket(buffer, LINELEN); sock.receive(dp); System.out.println(new String(dp.getData(), 0, dp.getlength())); sock.close(); catch (Exception e) { e.printstacktrace(); 29

Podsumowanie 1. Programowanie z wykorzystaniem gniazd - kontynuacja gniazda w Javie, transmisja TCP i UDP, protokół NTP / SNTP. 30