SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)



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

Gniazda BSD. komunikacja bezpołączeniowa

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

Sieciowa komunikacja procesów - XDR i RPC

Iteracyjny serwer TCP i aplikacja UDP

Programowanie sieciowe

Krótkie wprowadzenie do korzystania z OpenSSL

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

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

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Programowanie przy użyciu gniazdek

Programowanie Sieciowe 1

2. Interfejs gniazd Gniazdo

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

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

Pobieranie argumentów wiersza polecenia

Internet Control Message Protocol Aplikacja ping

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Programowanie Proceduralne

Wstęp do Programowania, laboratorium 02

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )

Uzupełnienie dot. przekazywania argumentów

Wstęp do programowania 1

1. Utwórz blok pamięci współdzielonej korzystając z poniższego kodu:

5. Algorytmy serwera

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Oprogramowanie komunikacyjne dla Internetu rzeczy Laboratorium nr 4 komunikacja unicastowa IPv6

Komunikacja sieciowa - interfejs gniazd

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Podstawowe typy serwerów

Instytut Teleinformatyki

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

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

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

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

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

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

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Zarządzanie ruchem w sieci IP. Komunikat ICMP. Internet Control Message Protocol DSRG DSRG. DSRG Warstwa sieciowa DSRG. Protokół sterujący

Instytut Teleinformatyki

Funkcje zawarte w bibliotece < io.h >

Funkcje zawarte w bibliotece < io.h >

Dariusz Chaberski. UMK Toruń

Klient-Serwer Komunikacja przy pomocy gniazd

4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu.

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Języki i metodyka programowania. Wprowadzenie do języka C

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

Procesy w systemach UNIX i Linux

Podział programu na moduły

1. Model klient-serwer

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Część 4 życie programu

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

Typy danych. Przemysław Gawroński D-10, p lutego Wykład 1. (Wykład 1) Typy danych 25 lutego / 11

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

Podstawy programowania C. dr. Krystyna Łapin

Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011

Tablice, funkcje - wprowadzenie

1. Timery i zdarzenia

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

x szereg(x)

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

I - Microsoft Visual Studio C++

Architektura typu klient serwer: uproszczony klient POP3

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

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

Pytania sprawdzające wiedzę z programowania C++

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

J. Ułasiewicz Programowanie aplikacji współbieżnych 1

Projektowanie klas c.d. Projektowanie klas przykład

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Instytut Teleinformatyki

Katedra Elektrotechniki Teoretycznej i Informatyki. sem. II - wykład 6. Dr hab. inż. M. Czyżak

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 3 - sem.iii. Dr inż. M. Czyżak

Serwer współbieżny połączeniowy

iseries Programowanie z użyciem gniazd

C++ wprowadzanie zmiennych

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Programowanie Proceduralne

J. Ułasiewicz Łącza nienazwane, nazwane, select 1

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

Wprowadzenie do programowania i programowanie obiektowe

Zdalne wywoływanie procedur RPC. Dariusz Wawrzyniak 1

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

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

Gniazda. S. Samolej: Gniazda 1

Sygnały. 7. Sygnały (2005/2006)

Zdalne wywoływanie procedur RPC

Zdalne wywoływanie procedur RPC

7. Sterowanie współbieżnością

Transkrypt:

Program my_ping: wysłanie komunikatu ICMP z żądaniem echa Struktura icmp (plik netinet/ip_icmp.h) 0 7 8 15 16 31 TYP (icmp_type) KOD (icmp_code) IDENTYFIKATOR (icmp_id) SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq) 8 bajtów DANE NIEOBOWIĄZKOWE (icmp_data) icmp_type = ICMP_ECHO (8) icmp_code = 0 w odpowiedzi: icmp_type = ICMP_ECHOREPLY (0) Opracował: Zbigniew Suski strona 1

// Plik własny my_ping.h #include <errno.h> #include <netinet/in_systm.h> #include <netinet/ip.h> #include <netinet/ip_icmp.h> #include <signal.h> #include <unistd.h> #include <stdio.h> // definicje symboli... // zmienne globalne char bufor_odbiorczy[bufsize]; char bufor_nadawczy[bufsize]; struct sockaddr_in adres_nadawczy; struct sockaddr_in adres_odbiorczy; int dlugosc_danych = 56; /* liczba bajtów za nagłówkiem ICMP */ char *host; int numer_pakietu; pid_t pid; /* PID procesu nadajnika */ int gniazdo; int opcja_v = 0; // prototypy funkcji... Opracował: Zbigniew Suski strona 2

// plik główny my_ping.c void Obsluga_zegara(int nr_sygnalu) Nadaj_komunikat_ICMP_ECHO(); alarm(1); return; int main(int argc, char **argv) int c; int rozmiar; int dl_adr; struct timeval czas_odebrania_pakietu; int n; signal(sigalrm, Obsluga_zegara); pid = getpid(); numer_pakietu=1; // Umieszczenie w strukturze adresowej adresu serwera memset((char *) &adres_nadawczy, 0, sizeof(adres_nadawczy)) ; adres_nadawczy.sin_family = AF_INET; adres_nadawczy.sin_addr.s_addr = inet_addr(host); printf("ping %s : %d bajtow danych\n", inet_ntoa(adres_nadawczy.sin_addr), dlugosc_danych); if ((gniazdo = socket(adres_nadawczy.sin_family, SOCK_RAW, IPPROTO_ICMP)) < 0) printf("blad UTWORZENIA GNIAZDA"); _exit(1); setuid(getuid()); /* zmiana id właściciela procesu */ Obsluga_zegara(SIGALRM); /* wysłanie pierwszego pakietu */ Opracował: Zbigniew Suski strona 3

while(1) dl_adr=sizeof(adres_odbiorczy); n = recvfrom(gniazdo, bufor_odbiorczy, BUFSIZE, 0, (struct sockaddr *) &adres_odbiorczy, &dl_adr); if (n < 0) printf("blad RECVFROM"); gettimeofday(&czas_odebrania_pakietu, NULL); Przetworz_komunikat_ICMP_ECHOREPLY (bufor_odbiorczy, n, &czas_odebrania_pakietu); exit(0); Opracował: Zbigniew Suski strona 4

// inne pliki źródłowe void Nadaj_komunikat_ICMP_ECHO(void) int dlugosc; struct icmp *icmp; icmp = (struct icmp *) bufor_nadawczy; icmp->icmp_type = ICMP_ECHO; icmp->icmp_code = 0; icmp->icmp_id = pid; icmp->icmp_seq = numer_pakietu++; gettimeofday((struct timeval *) icmp->icmp_data, NULL); // suma kontrolna naglowka ICMP i danych dlugosc = 8 + dlugosc_danych; icmp->icmp_cksum = 0; icmp->icmp_cksum = Suma_kontrolna((u_short *) icmp, dlugosc); if (sendto(gniazdo, bufor_nadawczy, dlugosc, 0, (struct sockaddr *)&adres_nadawczy, sizeof(adres_nadawczy))<0) printf("blad W SENDTO"); Opracował: Zbigniew Suski strona 5

void Przetworz_komunikat_ICMP_ECHOREPLY (char *bufor, ssize_t rozmiar_pakietu, struct timeval *czas_odebrania) int rozmiar_ip, rozmiar_icmp; double rtt; struct ip *ip; struct icmp *icmp; struct timeval *czas_nadania; ip = (struct ip *) bufor; /* początek nagłówka IP */ rozmiar_ip = ip->ip_hl << 2; /* rozmiar nagłówka IP */ /* początek nagłówka ICMP */ icmp = (struct icmp *) (bufor + rozmiar_ip); if ( (rozmiar_icmp = rozmiar_pakietu - rozmiar_ip) < 8) printf("rozmiar odebranego pakietu ICMP < 8"); /* Odpowiedź z echem ICMP */ if (icmp->icmp_type == ICMP_ECHOREPLY) /* to nie jest odpowiedz na wysłane zapytanie */ if (icmp->icmp_id!= pid) return; if (rozmiar_icmp < 16) printf("rozmiar odebranej odpowiedzi ECHO ICMP < 16"); czas_nadania = (struct timeval *) icmp->icmp_data; Roznica_czasu(czas_odebrania, czas_nadania); rtt = czas_odebrania->tv_sec * 1000.0 + czas_odebrania->tv_usec / 1000.0; printf("%d bajtow od %s: nr_sekw=%u, ttl=%d, rtt=%.3f ms\n", rozmiar_icmp, inet_ntoa(adres_odbiorczy.sin_addr), icmp->icmp_seq, ip->ip_ttl, rtt); Opracował: Zbigniew Suski strona 6

Kod niżej przedstawionej funkcji został przepisany z książki W. R. Stevensa: UNIX programowanie usług sieciowych, część 1. str. 748, funkcja in_cksum unsigned short Suma_kontrolna(unsigned short *bufor, int ilosc) int nleft = ilosc; int sum = 0; unsigned short *w = bufor; unsigned short wynik = 0; /* * Our algorithm is simple, using a 32 bit accumulator (sum), we add * sequential 16 bit words to it, and at the end, fold back all the * carry bits from the top 16 bits into the lower 16 bits. */ while (nleft > 1) sum += *w++; nleft -= 2; /* 4mop up an odd byte, if necessary */ if (nleft == 1) *(unsigned char *)(&wynik) = *(unsigned char *)w ; sum += wynik; /* 4add back carry outs from top 16 bits to low 16 bits */ sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ sum += (sum >> 16); /* add carry */ wynik = ~sum; /* truncate to 16 bits */ return(wynik); Opracował: Zbigniew Suski strona 7