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



Podobne dokumenty
Programowanie sieciowe

Serwer współbieżny połączeniowy

Podstawowe typy serwerów

Programowanie współbieżne i rozproszone

Gniazda komunikacji sieciowej w środowisku Java

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

STRUMIENIE DANYCH, SERIALIZACJA OBIEKTÓW

Klient-Serwer Komunikacja przy pomocy gniazd

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

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

Programowanie sieciowe

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

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

Aplikacja wielowątkowa prosty komunikator

Programowanie rozproszone w języku Java

Platformy Programistyczne Zagadnienia sieciowe i wątki

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

Programowanie Sieciowe 1

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

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

Networking. Zaawansowane technologie Javy 2019

Podstawowe typy serwerów

Programowanie przy użyciu gniazdek

Przykłady interfejsu TCP i UDP w Javie

Iteracyjny serwer TCP i aplikacja UDP

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

Komunikacja z użyciem gniazd aplikacje klient-serwer

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

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

Aplikacja wielow tkowa prosty komunikator

Zwielokrotnianie wejścia wyjścia

Gniazda BSD implementacja w C#

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

Komunikaty w Windows. Jarosław Kuchta

Java a dost p do Internetu.

Zadanie 2: transakcyjny protokół SKJ (2015)

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

Gniazda. S. Samolej: Gniazda 1

Wybrane działy Informatyki Stosowanej

Podstawy i języki programowania

JAVA. Strumienie wejścia i wyjścia. Pliki - zapis i odczyt

Programowanie aplikacji w architekturze Klient-Serwer - UDP

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

Programowanie sieciowe

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

JAVA I SIECI. MATERIAŁY:

Gniazda BSD. komunikacja bezpołączeniowa

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

KOMUNIKACJA MIĘDZYPROCESOWA O B S Ł U G A WEJŚCIA/WYJŚCIA

Adresy URL. Zaawansowane technologie Javy 2019

K O M U N I K A C J A MIĘDZYPROCESOWA O B S Ł U G A WEJŚCIA/WYJŚCIA

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

Instytut Teleinformatyki

Metody zawarte w klasie File: boolean createnewfile() tworzy nowy, pusty plik, ale tylko jeśli on wcześniej nie istniał. boolean delete() usuwa dany

Wykład 2. Strumienie tekstowe (wprowadzanie danych z klawiatury) i bajtowe, otwieranie strumieni poprzez sieć - obiekty URL

Architektura typu klient serwer: uproszczony klient POP3

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

Java programowanie w sieci. java.net RMI

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

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Aplikacja Sieciowa wątki po stronie klienta

PROTOKOŁY WARSTWY TRANSPORTOWEJ

Java programowanie sieciowe

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

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

Programowanie sieciowe

Statystyka protokołów i połączeń sieciowych.

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

Sieci komputerowe 1 DSRG

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

socket(int domain, int type, int protocol)

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

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

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

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

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Tryb bezpołączeniowy (datagramowy)

Winsock. Sieci Komputerowe II Wyk ład 3

Komunikacja sieciowa - interfejs gniazd

Komunikacja za pomocą potoków. Tomasz Borzyszkowski

4. Komunikacja pomiędzy procesami przez łącza nienazwane i nazwane

STRUMIENIE TEKSTOWE WEJŚCIOWE WPROWADZANIE DANYCH STRUMIENIE BAJTOWE, STRUMIENIE TEKSTOWE

2. Interfejs gniazd Gniazdo

Strumienie tekstowe (wprowadzanie danych z klawiatury) i bajtowe, otwieranie strumieni przez sieć - obiekty URL

Delphi 7 + Indy 10 Przykłady prostych aplikacji sieciowych

Lekcja 5. Funkcje handlemessage() i initialize(), konstruktor i destruktor

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Windows.

Podstawy programowania w języku C dla środowiska Windows

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

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

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

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

Programowanie w języku Java

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

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

Język ludzki kod maszynowy

Strumienie i serializacja

Transkrypt:

Schemat dla UDP = możliwe zablokowanie aplikacji KLIENT s=socket(...) [bind(s,...)] sendto(s,...) recvfrom(s,...) sendto(s,...) close(s) SERWER s=socket(...) bind(s,...) recvfrom(s,...) sendto(s,...) recvfrom(s,...) close(s) Programowanie sieciowe - wykład 2 1

Schemat dla TCP KLIENT s=socket(...) [bind(s,...)] connect(s,...) send(s,...) recv(s,...) send(s,...) close(s) SERWER s=socket(...) bind(s,...) listen(s,...) s2=accept(s) recv(s2,...) send(s2,...) recv(s2,...) close(s2) Programowanie sieciowe - wykład 2 2

Funkcja select Problem: Funkcje send, recv, sendto, recvfrom i accept są blokujące. Nie jest możliwa implementacja programu, który nasłuchuje jednocześnie na TCP i UDP i nie jest wielowątkowy. Rozwiązanie: Funkcja select. Programowanie sieciowe - wykład 2 3

Funkcja select c.d. #include <sys/select.h> lub #include <unistd.h> #include <sys/time.h> int select( int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) Programowanie sieciowe - wykład 2 4

Funkcja select c.d. FD_CLR(int fd, fd_set *set) Usu ń deskryptor fd ze zbioru set. FD_ISSET(int fd, fd_set *set) Czy fd znajduje si ę w zbiorze set? FD_SET(int fd, fd_set *set) Dodaj fd do zbioru set. FD_ZERO(fd_set *set) Wyczyść cały zbiór set. Programowanie sieciowe - wykład 2 5

Funkcja select c.d. struct timeval { long tv_sec; /* sekundy */ long tv_usec; /* mikrosekundy */ } Programowanie sieciowe - wykład 2 6

Funkcja select c.d. Funkcja select zwraca liczbę deskryptorów, na których zaszły zdarzenia. Dany zbiór deskryptorów może być ignorowany (podajemy NULL). Podanie NULL jako czasu oczekiwania powoduje natychmiastowy powrót. Podanie zerowego czasu oczekiwania oznacza czekanie do skutku. Programowanie sieciowe - wykład 2 7

Funkcja select c.d. Zwracana wartość to liczba deskryptorów, na których wystąpiło zdarzenie. 0 oznacza przeterminowanie (minął czas a nic się nie wydarzyło), a -1 to błąd (np. nieprawidłowe deskryptory w zbiorach). Dzięki select możliwy jest nasłuch na wielu gniazdach jednocześnie. Programowanie sieciowe - wykład 2 8

Funkcja select - przykład [...] int dtcp, dudp, maxd, ret; struct timeval tv; fd_set zbior; dtcp = socket(af_inet, SOCK_STREAM, 0); dudp = socket(af_inet, SOCK_DGRAM, 0); [ bind, listen na dtcp ale NIE accept] Programowanie sieciowe - wykład 2 9

Funkcja select c.d. maxd = (dtcp > dudp? dtcp : dudp); tv.tv_sec = tv.tv_usec = 0; FD_ZERO(&zbior); FD_SET(dtcp, &zbior); FD_SET(dudp, &zbior); ret = select( maxd, &zbior, NULL, NULL, &tv ); Programowanie sieciowe - wykład 2 10

Funkcja select c.d. if (ret > 0) { if (FD_ISSET(dtcp, &zbior)) { [accept, send, recv,...] } if (FD_ISSET(dudp, &zbior)) { [recvfrom, sendto,...] } } Programowanie sieciowe - wykład 2 11

Biblioteka WinSock Implementacja w wsock32.dll. Konieczna inicjalizacja i zwolnienie zasobów. #include <winsock2.h> WSAStartup(WORD wersja, WSADATA *info) info.imaxsockets maksymalna liczba gniazd info.imaxudpdg maksymalna długość datagramu WSACleanup() Programowanie sieciowe - wykład 2 12

Winsock - kompilacja Należy linkować z wsock32: Kompilatory GNU (np. MinGW): gcc -o wykonywalny zrodlo.c -lwsock32 Kompilator Borland C++: bcc32 zrodlo.c wsock32.lib Kompilator Visual C++: cl /Fewykonywalny zrodlo.c wsock32.lib Programowanie sieciowe - wykład 2 13

Winsock Typ deskryptora gniazda: SOCKET Tworzenie gniazda: socket Kojarzenie z portem: bind Nasłuch TCP: listen Akceptowanie połączenia TCP: accept Nawiązanie połączenia TCP: connect Wysyłanie / odbieranie danych: send, recv Komunikacja UDP: sendto, recvfrom Zamknięcie gniazda: closesocket Programowanie sieciowe - wykład 2 14

Winsock BSD / Unix: Deskryptory gniazd sieciowych są traktowane tak samo jak inne deskryptory w systemie (możliwe wysyłanie i odbieranie danych za pomocą read i write, zamknięcie gniazda przez close itd.). Winsock: Deskryptory gniazd sieciowych i deskryptory plików zachowują się różnie (dlatego np. nie można zamykać gniazd za pomocą close). Programowanie sieciowe - wykład 2 15

Winsock Dwa zestawy funkcji: zgodne z gniazdami BSD (socket, connect, listen, inet_addr, htonl,...) - zgodność prawie w 100% (wyjątki: typ SOCKET, funkcja closesocket, wartości zwracane przez niektóre funkcje) specyficzne dla API Win32 (nazwy zaczynają się od WSA, np. WSAStartup, WSAAsyncSelect) Programowanie sieciowe - wykład 2 16

Win32 - okna HWND Programowanie sieciowe - wykład 2 17

Obsługa komunikatów PĘTLA KOMUNIKATÓW Okno switch (umsg) { case WM_INITDIALOG: return TRUE; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } case WM_COMMAND: switch (wparam) { OBSŁUGA KOMUNIKATÓW OKNA case IDOK: case IDCANCEL: EndDialog(hDlg, TRUE); return TRUE; } } return FALSE; Programowanie sieciowe - wykład 2 18

Komunikat (UINT typ, WPARAM par1, LPARAM par2) typ: liczba całkowita (rodzaj komunikatu) par1: liczba całkowita 16-bitowa par2: liczba całkowita 32-bitowa (zwykle adres bufora) Programowanie sieciowe - wykład 2 19

Rodzaje komunikatów Komunikaty systemu dla okien, np. WM_PAINT, WM_CLOSE, WM_MOUSEDOWN, WM_COMMAND... Komunikaty użytkownika: WM_USER, WM_USER+1, WM_USER+2,... Komunikaty interakcji komponentów, np. (dla komponentu typu lista) LB_GETTEXT, LB_GETCURSEL, LB_ADDSTRING... Programowanie sieciowe - wykład 2 20

Źródła komunikatów Skąd komunikaty biorą się w kolejce komunikatów okna? Wstawiane przez system (np. WM_KEYDOWN, WM_MOUSEDOWN) Wysyłane przez aplikację za pomocą SendMessage (np. LB_ADDSTRING, WM_SETFONT) Programowanie sieciowe - wykład 2 21

Pętla komunikatów dopóki są komunikaty w kolejce m := pierwszy komunikat z kolejki w := okno, w którym wystąpił komunikat wynik := false dopóki wynik=false i w jest oknem wynik := funkcja obsługi komunikatów w oknie w dla komunikatu m jeśli wynik = false to w := właściciel(w) Programowanie sieciowe - wykład 2 22

Funkcje blokujące w Win32 Jeśli aplikacja okienkowa Win32 uruchomi funkcję blokującą (np. recv, recvfrom), to pętla komunikatów nie jest obsługiwana do momentu zakończenia zablokowanej funkcji. Skutek: program nie reaguje ani na zdarzenia użytkownika (kliknięcia, wciskanie klawiszy), ani na zdarzenia systemu (odświeżanie zawartości, zamknięcie). Dla użytkownika program wygląda jakby się zawiesił. Programowanie sieciowe - wykład 2 23

Funkcja WSAAsyncSelect WSAAsyncSelect(gniazdo, okno, komunikat, zdarzenie) SOCKET gniazdo gniazdo, które będzie monitorowane HWND okno okno, które otrzyma komunikat gdy wystąpi zdarzenie UINT komunikat rodzaj wysyłanego komunikatu (zwykle WM_USER+x) long zdarzenie rodzaj zdarzenia (FD_ACCEPT, FD_CONNECT, FD_READ, FD_WRITE, FD_CLOSE) Programowanie sieciowe - wykład 2 24

Funkcja WSAAsyncSelect WSAAsyncSelect(s, hwnd, POLACZENIE, FD_ACCEPT) Skutek: W momencie, gdy na gnieździe s wystąpi zdarzenie FD_ACCEPT (czyli gdy pojawi się przychodzące połączenie sieciowe), do okna o uchwycie hwnd zostanie wysłany komunikat POLACZENIE. Komunikat ten powinien zostać obsłużony w pętli komunikatów okna hwnd. Reakcją na POLACZENIE może być np. wykonanie accept, wysłanie / odebranie danych i zamknięcie sesji TCP. Programowanie sieciowe - wykład 2 25

WSAAsyncSelect OKNO Pętla komunikatów 5 1 socket bind listen 2 WSAAsyncSelect 4 WM_POLACZENIE gniazdo accept recv/send close 6 3 connect Programowanie sieciowe - wykład 2 26

Funkcja WSAAsyncSelect Korzyść: WSAAsyncSelect jest funkcją nieblokującą (wraca natychmiast). Pozwala na monitorowanie stanu gniazda i jednoczesne przetwarzanie kolejki komunikatów. Dzięki temu aplikacja oczekująca na połączenie sieciowe poprawnie reaguje na wszystkie komunikaty. Programowanie sieciowe - wykład 2 27

Gniazda w Javie Pakiet java.net: klasy gniazd TCP i UDP, adresy internetowe, datagramy. Pakiet java.io: strumienie wejściowe i wyjściowe. Programowanie sieciowe - wykład 2 28

Najważniejsze klasy java.net.inetaddress java.net.socket java.net.serversocket java.net.datagramsocket java.net.datagrampacket java.io.inputstream java.io.outputstream java.io.datainputstream java.io.dataoutputstream Programowanie sieciowe - wykład 2 29

java.net.inetaddress Nie posiada konstruktora. Metody statyczne: InetAddress getbyname(string nazwa/adres) InetAddress getlocalhost() Inne metody: String gethostname() byte[] getaddress() Programowanie sieciowe - wykład 2 30

java.net.socket Reprezentuje gniazdo TCP strony klienta. Konstruktor (jeden z wielu): Socket(InetAddress adres, int port) Tworzy gniazdo i wykonuje połączenie (connect) na podany adres i numer portu. Programowanie sieciowe - wykład 2 31

java.net.socket java.io.inputstream getinputstream() java.io.outputstream getoutputstream() Metody pobierają strumienie: wejściowy i wyjściowy skojarzone z gniazdem. Zwykle na InputStream i OutputStream budujemy wygodniejsze strumienie (np. DataInputStream i DataOutputStream lub ObjectInputStream i ObjectOutputStream). Programowanie sieciowe - wykład 2 32

java.net.socket Schemat: InetAddress adres = InetAddress.getByName(''atos.wmid.amu.edu.pl''); Socket s = new Socket(adres, port); DataOutputStream dos = new DataOutputStream(s.getOutputStream()); DataInputStream dis = new DataInputStream(s.getInputStream()); dos.writeutf(''tekst''); double d = dis.readdouble(); dis.close(); dos.close(); s.close(); Programowanie sieciowe - wykład 2 33

java.net.serversocket Konstruktor (jeden z wielu): ServerSocket(int port) Tworzy gniazdo TCP nasłuchujące na porcie o numerze port. Programowanie sieciowe - wykład 2 34

java.net.serversocket Schemat: ServerSocket ss = new ServerSocket(4500); while (warunek stopu) { Socket s = ss.accept(); [ strumienie na s, operacje wejścia/wyjścia, jak dla gniazda klienta ] s.close(); } ss.close(); Programowanie sieciowe - wykład 2 35

java.net.datagramsocket Konstruktory: DatagramSocket(int port) Tworzy gniazdo UDP skojarzone z lokalnym portem o numerze port. DatagramSocket() Tworzy gniazdo UDP skojarzone z lokalnym portem o numerze nadanym przez system operacyjny. Programowanie sieciowe - wykład 2 36

java.net.datagramsocket send(datagrampacket datagram) receive(datagrampacket datagram) Wysyła / odbiera datagram. W obu przypadkach parametr musi być wcześniej utworzonym datagramem (patrz dalej). Programowanie sieciowe - wykład 2 37

java.net.datagrampacket Konstruktory: DatagramPacket(byte[] bufor, int długość) Tworzy obiekt, który może być użyty w DatagramSocket.receive(...). DatagramPacket(byte[] bufor, int długość, InetAddress adres docelowy, int port docelowy) Tworzy obiekt, który może być użyty w DatagramSocket.send(...) Programowanie sieciowe - wykład 2 38

java.net.datagrampacket Inne metody: byte[] getdata() - pobierz dane z datagramu void setdata(byte[] dane) ustaw dane void setaddress(inetaddress adr) ustaw adres docelowy void setport(int port) ustaw port docelowy SocketAddress getsocketaddress() - pobierz adres nadawcy datagramu int SocketAddress.getPort() InetAddress SocketAddress.getAddress() Programowanie sieciowe - wykład 2 39

java.io.inputstream int read() - czytaj jeden bajt int read(byte[] bufor) czytaj co najwyżej bufor.length bajtów close() - zamknij strumień Programowanie sieciowe - wykład 2 40

java.io.outputstream write(int b) zapisz jeden bajt do strumienia write(byte[] bufor) zapisz zawartość bufora do strumienia close() - zamknij strumień Programowanie sieciowe - wykład 2 41

java.io.datainputstream DataInputStream(InputStream in) boolean readboolean() byte readbyte() char readchar() double readdouble() int readint() String readutf() void close() Programowanie sieciowe - wykład 2 42

java.io.dataoutputstream DataOutputStream(OutputStream out) void writeboolean(boolean v) void writebyte(int v) void writechar(int v) void writedouble(double v) void writeint(int v) void writeutf(string v) void close() Programowanie sieciowe - wykład 2 43

Wyjątki Praktycznie wszystkie operacje na gniazdach i strumieniach mogą potencjalnie wyrzucić wyjątek w przypadku błędu. Wyjątki takie należy przechwytywać i obsługiwać w aplikacji. W niektórych przypadkach program nie da się nawet skompilować z powodu nieprzechwyconych wyjątków. Programowanie sieciowe - wykład 2 44

Przechwytywanie wyjątków try { [ operacje na gniazdach / strumieniach ] } catch (Exception e) { [ obsługa wyjątku e ] } Programowanie sieciowe - wykład 2 45