Przykład aplikacji UDP



Podobne dokumenty
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);

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

Programowanie sieciowe

Komunikacja sieciowa - interfejs gniazd

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

Gniazda BSD. komunikacja bezpołączeniowa

Internet Control Message Protocol Aplikacja ping

6. Rozbudowany interfejs gniazd

Programowanie Sieciowe 1

Krótkie wprowadzenie do korzystania z OpenSSL

Iteracyjny serwer TCP i aplikacja UDP

Programowanie sieciowe

Programowanie przy użyciu gniazdek

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

1. Model klient-serwer

2. Interfejs gniazd Gniazdo

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

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

W różnych systemach definicje mogą się różnić od powyższej. W linuxie sprobuj man 7 ip do wyswietlenia opisu.

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

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

Instytut Teleinformatyki

Architektura typu klient serwer: uproszczony klient POP3

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

Zaawansowane operacje wejścia/wyjścia

Unix: programowanie sieciowe

Zwielokrotnianie wejścia wyjścia

Zaawansowane operacje wejścia/wyjścia

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

TIN Techniki Internetowe zima

Gniazda. S. Samolej: Gniazda 1

Zaawansowane operacje wejścia/wyjścia

5. Algorytmy serwera

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

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

socket(int domain, int type, int protocol)

Podstawowe typy serwerów

Zaawansowane operacje wejścia/wyjścia

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

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

Gniazda BSD implementacja w C#

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

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

Oprogramowanie komunikacyjne dla Internetu rzeczy Laboratorium nr 4 komunikacja unicastowa IPv6

Serwer współbieżny połączeniowy

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

1 Sposób zaliczenia przedmiotu

4. Algorytmy klienta

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

Programowanie z użyciem RPC

iseries Programowanie z użyciem gniazd

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

Programowanie z wykorzystaniem gniazd

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

Co nie powinno być umieszczane w plikach nagłówkowych:

Protokół DNS. Aplikacja dnsquery

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

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

Programowanie Proceduralne

Sieciowa komunikacja procesów - XDR i RPC

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

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

Podstawowe typy serwerów

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

Programowanie Programowanie z użyciem gniazd

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Projektowanie oprogramowania systemów KOMUNIKACJA SIECIOWA I SYSTEMY RPC

Oprogramowanie systemów równoległych i rozproszonych. Wykład 6

Wstęp do programowania 1

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

Informatyka. Wy-02 Tablice, wskaźniki, warunki i pętle. mgr inż. Krzysztof Kołodziejczyk

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

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

Wstęp do programowania 1

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

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

Programowanie Sieciowe 1

Bezpieczeństwo Usług Sieciowych SSL API. dr inż. Tomasz Surmacz. 28 listopada 2011

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Łącza nienazwane(potoki)

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

Tworzenie aplikacji rozproszonej w Sun RPC

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

Część 4 życie programu

Serwery współbieżne c.d.

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

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

Pobieranie argumentów wiersza polecenia

Programowanie Programowanie z użyciem gniazd

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

struct Student { char nazwisko[30]; int wiek; float ocena; }; #define MAX_ROZMIAR 3 Student lista_studentow[max_rozmiar];

I - Microsoft Visual Studio C++

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Laboratorium 3. Instrukcje wyboru

Architektura typu klient - serwer. Oprogramowanie systemów równoległych i rozproszonych. Wykład 6. Cechy architektury klient - serwer

Zdalne wywoływanie procedur RPC. Dariusz Wawrzyniak 1

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

Wprowadzenie do programowania w języku C

Transkrypt:

#include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> /* atoi */ #include <netinet/in.h> /* htons, ntohs... */ #include <string.h> /* memset */ #include <arpa/inet.h> /* inet_ntoa */ #include <stdio.h> /* getchar */ int main(int argc,char **argv) struct sockaddr_in addr; int sock,ret,len; char c; if (argc<3) printf("udp_app <port> n o [ <ip_odbiorcy> <port_odbiorcy> ] \n\n"); return 5; Przykład aplikacji UDP memset(&addr,'\0',sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(atoi(argv[1])); addr.sin_addr.s_addr = inet_addr("192.168.1.1"); sock = socket(af_inet,sock_dgram,0); if (sock== 1) printf("nie moge utworzyc gniazdka!\n"); return 2; if (bind(sock,(struct sockaddr*)&addr, sizeof(addr))== 1) printf("nie moge dowiazac gniazdka!\n"); return 3; Oskar Świda 2005 1

Przykład aplikacji UDP cd. switch (argv[2][0]) case 'o': printf("odbiorca, czekam na dane:\n\n"); while (1) memset(&addr,0,sizeof(addr)); ret = recvfrom(sock,&c,1,0,(struct sockaddr*) &addr, &len); printf("otrzymalem znak %c\n",c); if (c=='q') break; break; case 'n': printf("nadawca, podaj znaki z klawiatury. Znak 'q' konczy prace.\n\n"); if (argc>=5) memset(&addr,0,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(atoi(argv[4])); addr.sin_addr.s_addr = inet_addr(argv[3]); while (1) c = (char)getchar(); ret = sendto(sock,&c,1,0, struct sockaddr*)&addr, sizeof(addr)); if (c=='q') break; else printf("nie podales adresu ip i portu odbiorcy\n\n"); break; /* switch */ close(sock); /* main */ Oskar Świda 2005 2

int main(int argc,char **argv) struct sockaddr_in addr,servaddr; int sock,ret,len; char c; Klient TCP if (argc<4) printf("tcp_app_c <port> <ip_serwera> <port_serwera>\n\n"); return 5; memset(&addr,'\0',sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(atoi(argv[1])); addr.sin_addr.s_addr = inet_addr("192.168.1.1"); sock = socket(af_inet,sock_stream,0); if (sock== 1) printf("nie moge utworzyc gniazdka!\n"); return 2; if (bind(sock,(struct sockaddr*)&addr, sizeof(addr))== 1) printf("nie moge dowiazac gniazdka!\n"); return 3; memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(atoi(argv[3])); servaddr.sin_addr.s_addr = inet_addr(argv[2]); if (connect(sock,(struct sockaddr*)&servaddr, sizeof(servaddr))==0) printf("polaczenie nawiazane. Podaj znaki. Znak q konczy program.\n\n"); while (1) c = (char)getchar(); send(sock,&c,1,0); if (c=='q') break; else printf("nie moge nawiazac polaczenia!\n"); close(sock); Oskar Świda 2005 3

Serwer TCP int main(int argc,char **argv) struct sockaddr_in addr,servaddr; int sock,ret,len,sock2; char c; if (argc<2) printf("tcp_app_s <port> \n\n");return 5; memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(atoi(argv[1])); servaddr.sin_addr.s_addr = inet_addr("192.168.1.1"); sock = socket(af_inet,sock_stream,0); if (sock== 1) printf("nie moge utworzyc gniazdka!\n");return 2; if (bind(sock,(struct sockaddr*)&servaddr, sizeof(servaddr))== 1) printf("nie moge dowiazac gniazdka!\n");return 3; if (listen(sock,5)== 1) printf("nie moge ustawic gniazdka w tryb nasluchu!\n"); return 4; printf("serwer. Oczekuje na polaczenie\n\n"); memset(&addr,0,sizeof(addr)); len=0; sock2 = accept(sock,(structsockaddr*)&addr,&len); if (sock2>0) printf("polaczenie nawiazane z %s.\n\n", inet_ntoa(addr.sin_addr)); while (1) recv(sock2,&c,1,0); if (c=='q') break; printf("otrzymalem znak %c\n",c); close(sock2); else printf("blad: %s\n",strerror(errno)); close(sock); Oskar Świda 2005 4

Interfejs gniazd zagadnienia dodatkowe Dane priorytetowe MSG_OOB realizacja i wykorzystanie Tryb nieblokujący: fcntl (sock, F_SETFL, O_NONBLOCK fcntl(sock,f_getfl,0)) Przeglądanie zbioru deskryptorów: select (int numfds, fd_set *readfs, fd_set *writefs, fd_set *exceptfs,struct timeval *timeout) FD_ZERO(fd_set *set) wyczyść zbiór FD_SET(int fd, fd_set *set) dodaj deskryptor do zbioru FD_CLR(int fd, fd_set *set) usuń deskryptor ze zbioru FD_ISSET(inf fd, fd_set *set) sprawdź, czy deskryptor pozostał w zbiorze struct timeval int tv_sec; int tv_usec; Serwery iteracyjne Serwery współbieżne Oskar Świda 2005 5

Funkcje pomocnicze int getsockname( int fd, struct sockaddr* addr, socklen_t *len) adres lokalny int getpeername( int fd, struct sockaddr* addr, socklen_t *len) adres zdalny struct hostent *gethostbyname( const char *name ) adres wg nazwy struct hostent char *h_name; char **h_aliases; int h_addrtype; /* AF_INET */ int h_length; char **h_addr_list; #define h_addr h_addr_list[0]; int shutdown( int fd, int howto) SHUT_RD, SHUT_WR, SHUT_RDWR int getsockopt( int fd, int level, int optname, void *optval, int *optlen) int setsockopt( int fd, int level, int optname, void *optval, int optlen) level = SOL_SOCKET, IPPROTO_IP, IPPROTO_TCP, Oskar Świda 2005 6

Interfejs gniazd wybrane opcje SOL_SOCKET: SO_BROADCAST SO_ERROR (pobierz błąd i wyjdź) SO_KEEPALIVE (2h!) SO_LINGER (struct linger l_onoff, l_time) SO_OOBINLINE SO_TYPE IP_PROTOIP: IP_HDRINCL IP_TTL IP_PROTOTCP: TCP_KEEPALIVE TCP_MAXSEG SO_RCVBUF SO_SNDBUF SO_RCVLOWAT (min. dla select) SO_SNDLOWAT SO_REUSEADDR IP_TOS TCP_MAXRT TCP_NODELAY Oskar Świda 2005 7