Programowanie Sieciowe 1

Podobne dokumenty
Gniazda BSD. komunikacja bezpołączeniowa

Iteracyjny serwer TCP i aplikacja UDP

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

Programowanie przy użyciu gniazdek

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

Komunikacja sieciowa - interfejs gniazd

Podstawowe typy serwerów

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

Programowanie Sieciowe 1

Gniazda BSD implementacja w C#

Klient-Serwer Komunikacja przy pomocy gniazd

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

Programowanie sieciowe

2. Interfejs gniazd Gniazdo

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

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

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

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

Instytut Teleinformatyki

Gniazda. S. Samolej: Gniazda 1

Tryb bezpołączeniowy (datagramowy)

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

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

Programowanie współbieżne i rozproszone

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

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

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

Krótkie wprowadzenie do korzystania z OpenSSL

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

Oprogramowanie komunikacyjne dla Internetu rzeczy Laboratorium nr 4 komunikacja unicastowa IPv6

Internet Control Message Protocol Aplikacja ping

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

1. Model klient-serwer

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

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

Projektowanie oprogramowania systemów KOMUNIKACJA SIECIOWA I SYSTEMY RPC

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

Winsock. Sieci Komputerowe II Wyk ład 3

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

Sieci komputerowe 1 DSRG

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

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

Programowanie Sieciowe 1

Przykłady interfejsu TCP i UDP w Javie

socket(int domain, int type, int protocol)

iseries Programowanie z użyciem gniazd

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

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

Programowanie sieciowe

Programowanie rozproszone w języku Java

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

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

Serwer współbieżny połączeniowy

Podstawowe typy serwerów

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

Architektura typu klient serwer: uproszczony klient POP3

Protokół ARP. dr Zbigniew Lipiński. Instytut Matematyki i Informatyki ul. Oleska Opole zlipinski@math.uni.opole.pl

Aplikacja Sieciowa wątki po stronie klienta

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

Programowanie sieciowe

1. Model klient-serwer

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

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

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

Zadanie 2: transakcyjny protokół SKJ (2015)

Przykład aplikacji UDP

Tworzenie aplikacji rozproszonej w Sun RPC

PROTOKOŁY WARSTWY TRANSPORTOWEJ

Programowanie Programowanie z użyciem gniazd

SEGMENT TCP CZ. II. Suma kontrolna (ang. Checksum) liczona dla danych jak i nagłówka, weryfikowana po stronie odbiorczej

Beej s Guide to Network Programming

Wykorzystanie protokołu UDP na potrzeby aplikacji do konfigurowania procesu paletyzacji kartonów dla robotów przemysłowych firmy Kawasaki

Serwery współbieżne c.d.

TIN Techniki Internetowe zima

Programowanie Programowanie z użyciem gniazd

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

Instytut Teleinformatyki

Komunikacja z użyciem gniazd aplikacje klient-serwer

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

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

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

Networking. Zaawansowane technologie Javy 2019

Routing. część 1: adresowanie. Sieci komputerowe. Wykład 2. Marcin Bieńkowski

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

Sieci komputerowe - Protokoły warstwy transportowej

4. Algorytmy klienta

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

Laboratorium z systemów operacyjnych. System plików - funkcje systemowe. Anna Wojak

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.

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

Standardy programowania protokołów komunikacyjnych Laboratorium nr 5 komunikacja multicastowa IPv6

Przesyłania danych przez protokół TCP/IP

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

KONFIGURACJA SIECIOWA SYSTEMU WINDOWS

Komunikacja przez sieć z wykorzystaniem biblioteki WINSOCK. dr inż. Piotr Kaczmarek Instytut Automatyki i Inżynierii Informatycznej

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

Protokół DNS. Aplikacja dnsquery

Wywoływanie procedur zdalnych

Wywoływanie procedur zdalnych

Transkrypt:

Programowanie Sieciowe 1 dr inż. Tomasz Jaworski tjaworski@iis.p.lodz.pl http://tjaworski.iis.p.lodz.pl/

Klient UDP

Kolejność wykonywania funkcji gniazdowych klienta UDP Protokół UDP jest bezpołączeniowy: Nie używana jest funkcja: accept, connect, listen. Źródło: [1]

Klient: Tworzenie gniazda [1] socket sendto recvfrom close int socket(int family, int type, int proto); Funkcja tworzy nowe gniazdo w systemie i konfiguruje je do zadanego protokołu. family rodzina protokołów: AF_INET protokół IPv4, AF_INET6 protokół IPv6 type rodzaj gniazda: SOCK_STREAM gniazdo strumieniowe, SOCK_DGRAM gniazdo datagramowe, SOCK_RAW gniazdo surowe (raw), proto protokół (dla type=sock_raw): 0 Domyślny protokół (SOCK_STREAM=TCP, SOCK_DGRAM=UDP), Wynik: uchwyt gniazda, lub: INVALID_SOCKET, kod błędu z WSAGetLastError (Windows), -1, kod błędu z errno (Unix)

Klient: Tworzenie gniazda [2] socket sendto recvfrom close W przypadku systemów Windows konieczne przed skorzystaniem z funkcji gniazdowych aplikacja musi zainicjować system Winsock. WSAData wsadata; int ncode; char errdesc[100]; if ((ncode = WSAStartup(MAKEWORD(1, 1), &wsadata))!= 0) { sprintf(errdesc, "Blad podczas inicjalizacji bibliteki WinSock. Blad %d", ncode); exit(1); } printf("winsock: %s [%s]\n", wsadata.szdescription, wsadata.szsystemstatus); printf("maxsockets: %d\n", wsadata.imaxsockets);

Klient: Tworzenie gniazda [3] socket sendto recvfrom close Przykłady: SOCKET sock_fd = socket(af_inet, SOCK_DGRAM, IPPROTO_UDP); SOCKET sock_fd = socket(af_inet, SOCK_DGRAM, 0); int sock_fd = socket(af_inet, SOCK_DGRAM, 0); SOCKET sock_fd = socket(af_inet, SOCK_DGRAM, 0);

Klient: Zapisywanie danych do gniazda socket sendto recvfrom close int sendto(int sock, const char* buf, int len, int flags, sockaddr *to, int tolen); Funkcja zapisuje dane do bufora nadawczego gniazda sock uchwyt gniazda (zwrócony przez socket lub accept), buf wskaźnik do bufora zawierającego dane do wysłania, buflen ilość bajtów do wysłania, flags flagi, domyślnie 0, to wskaźnik na strukturę sockaddr przechowującą adres i port odbiorcy, tolen długość, w bajtach, struktury sockaddr odbiorcy. Wynik: ilość wysłanych bajtów (blocking) lub ilość wysłanych bajtów buflen (nonblocking) lub: SOCKET_ERROR, kod błędu z WSAGetLastError (Windows), -1, kod błędu z errno (Unix)

Klient: Wczytywanie danych z gniazda socket sendto recvfrom close int recvfrom(int sock, char *buf, int buflen, int flags, sockaddr *from, int fromlen); Funkcja odczytuje dane z bufora odbiorczego gniazda sock uchwyt gniazda (zwrócony przez socket lub accept), buf wskaźnik do bufora docelowego, buflen ilość bajtów do odczytania, flags flagi, domyślnie 0 lub MSG_PEEK, from wskaźnik na strukturę sockaddr dla adresu i port nadawcy, fromlen długość, w bajtach, struktury sockaddr nadawcy. Wynik: 0 ilość wysłanych bajtów buflen, lub: SOCKET_ERROR, kod błędu z WSAGetLastError (Windows), -1, kod błędu z errno (Unix) UWAGA! Błąd WSAEMSGSIZE/EMSGSIZE oznacza, że bufor danych przeznaczony do odbioru był mniejszy niż odebrany datagram.

Operacje blokujące i nieblokujące dla recvfrom i sendto Blocking recvfrom czeka, aż w buforze odbiorczym będzie minimum 1 datagram do pobrania sendto czeka, aż w buforze nadawczym będzie wystarczająco dużo miejsca na wysłanie datagramu o długości buflen bajtów Nonblocking recvfrom wczytuje jeden datagram i zwraca ilość wczytanych bajtów. W przypadku braku danych w buforze, recvfrom zwraca SOCKET_ERROR a kod błędu = WSAEWOULDBLOCK/EWOULDBLOCK. sendto zapisuje do bufora tyle, ile może (nie mniej niż 1) i zwraca ilość zapisanych bajtów. W przypadku braku miejsca w buforze, sendto zwraca SOCKET_ERROR a kod błędu = WSAEWOULDBLOCK/EWOULDBLOCK.

Klient: Zamykanie połączenia socket sendto recvfrom close int closesocket(int sock); int close(int sock); // windows // unix Funkcja zamyka gniazdo a wraz z nim połączenie. Wszystkie aktywne operacje związane z gniazdem zą anulowane. sock uchwyt gniazda (zwrócony przez socket lub accept), Wynik: 0 gdy gniazdo zostało zamknięte, lub: SOCKET_ERROR, kod błędu z WSAGetLastError (Windows), -1, kod błędu z errno (Unix)

int main(int argc, char* argv[]) { WSAData data; int result; char datagram[1024]; } result = WSAStartup(MAKEWORD(2, 0), &data); assert(result == 0); SOCKET sock = socket(af_inet, SOCK_DGRAM, 0); assert(sock!= INVALID_SOCKET); sockaddr_in addr; int sa_size = sizeof(sockaddr_in); addr.sin_family = AF_INET; addr.sin_port = htons(3302); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); result = sendto(sock, datagram, 0, 0, (sockaddr*)&addr, sizeof(sockaddr_in)); result = recvfrom(sock, datagram, sizeof(datagram), 0, (sockaddr*)&addr, &sa_size); printf(datagram); closesocket(sock); return 0; Źródło: [1]

Serwer UDP

int main(int argc, char* argv[]) { WSAData data; int result, counter = 0; char line1[100], line2[100], line3[100]; char datagram[1024]; } result = WSAStartup(MAKEWORD(2, 0), &data); assert(result == 0); SOCKET server_socket = socket(af_inet, SOCK_DGRAM, 0); assert(server_socket!= INVALID_SOCKET); sockaddr_in service; service.sin_family = AF_INET; service.sin_port = htons(3302); service.sin_addr.s_addr = INADDR_ANY; result = bind(server_socket, (sockaddr*)&service, sizeof(sockaddr_in)); assert(result!= SOCKET_ERROR); Tutaj będzie główna pętla programu serwera UDP closesocket(socket); return 0;

while(true) { sockaddr_in client; int sa_size = sizeof(sockaddr_in); recvfrom(server_socket, datagram, sizeof(datagram), 0, (sockaddr*)&client, &sa_size); } time_t curr_time; time(&curr_time); tm *t = gmtime(&curr_time); counter++; sprintf(line1, "Data %02d/%02d/%04d\r\n", t->tm_mday, t->tm_mon + 1, t->tm_year + 1900); sprintf(line2, "Godzina %02d:%02d:%02d\r\n", t->tm_hour, t->tm_min, t->tm_sec); sprintf(line3, "Jestes klientem #%d\r\n", counter); sprintf(datagram, "%s%s%s", line1, line2, line3); sendto(server_socket, datagram, sizeof(datagram), 0, (sockaddr*)&client, sizeof(sockaddr_in));

Adres rozgłoszeniowy (broadcast) Adres rozgłoszeniowy umożliwia przesłanie pakietu datagramowego (UDP) do wszystkich komputerów w danej sieci.

Adres rozgłoszeniowy (broadcast) Przykład: Komputery: 192.168.0.1; 192.168.0.2; 192.168.0.3; Maska sieci: 255.255.255.0 Adres sieci: 192.168.0.0; adres rozgłoszeniowy: 192.168.0.255 Wysłanie datagramu UDP na adres IP=192.168.0.255 spowoduje odebranie go na wszystkich komputerach w sieci 192.168.0.0. Czyli jeśli są komputery z IP z zakresu 192.168.0.1-192.168.0.254 i nasłuchują na gniazdku umożliwiającym komunikację rozgłoszeniową, to otrzymają datagram. Niezwykle wygodne do tworzenia programów typu lan-chat lub systemów rozproszonych, identyfikowanych przez centralny węzeł.

SOCKET sock = socket(af_inet, SOCK_DGRAM, 0); assert(sock!= INVALID_SOCKET); BOOL t = true; result = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&t, sizeof(bool)); sockaddr_in send_addr, recv_addr; send_addr.sin_family = AF_INET; send_addr.sin_port = htons(3303); send_addr.sin_addr.s_addr = inet_addr("192.168.0.255"); recv_addr.sin_family = AF_INET; recv_addr.sin_port = htons(3303); recv_addr.sin_addr.s_addr = INADDR_ANY; result = bind(sock, (sockaddr*)&recv_addr, sizeof(sockaddr_in)); char *tekst = "Ala ma kota"; char buffer[100]; int s = sizeof(sockaddr_in); result = sendto(sock, tekst, strlen(tekst) + 1, 0, (sockaddr*)&send_addr, sizeof(sockaddr_in)); result = recvfrom(sock, buffer, strlen(tekst)+1, 0, (sockaddr*)&recv_addr, &s);

Dziękuję za uwagę!