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

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

Gniazda BSD. komunikacja bezpołączeniowa

Komunikacja sieciowa - interfejs gniazd

Iteracyjny serwer TCP i aplikacja UDP

Gniazda BSD implementacja w C#

Programowanie przy użyciu gniazdek

Programowanie sieciowe

2. Interfejs gniazd Gniazdo

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

1. Model klient-serwer

Programowanie Sieciowe 1

Podstawowe typy serwerów

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

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

socket(int domain, int type, int protocol)

Programowanie sieciowe

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

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. S. Samolej: Gniazda 1

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

Krótkie wprowadzenie do korzystania z OpenSSL

Oprogramowanie komunikacyjne dla Internetu rzeczy Laboratorium nr 4 komunikacja unicastowa IPv6

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

iseries Programowanie z użyciem gniazd

TIN Techniki Internetowe zima

Tryb bezpołączeniowy (datagramowy)

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

Przykład aplikacji UDP

Projektowanie oprogramowania systemów KOMUNIKACJA SIECIOWA I SYSTEMY RPC

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

Architektura typu klient serwer: uproszczony klient POP3

Programowanie Programowanie z użyciem gniazd

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

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

Podstawowe typy serwerów

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

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

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

Gniazda BSD UNIWERSYTET GDAŃSKI WYDZIAŁ MATEMATYKI I FIZYKI. Jacek Nowicki

Beej s Guide to Network Programming

Programowanie Programowanie z użyciem gniazd

Instytut Teleinformatyki

Internet Control Message Protocol Aplikacja ping

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

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

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

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

Sieci komputerowe 1 DSRG

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

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

Programowanie sieciowe z użyciem interfejsu gniazdek

Protokół DNS. Aplikacja dnsquery

Klient-Serwer Komunikacja przy pomocy gniazd

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

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

Sieci komputerowe. Zajęcia 5 Domain Name System (DNS)

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

Programowanie Proceduralne

Programowanie z wykorzystaniem gniazd

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

Programowanie sieciowe z użyciem interfejsu gniazdek

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

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

6. Rozbudowany interfejs gniazd

PROTOKOŁY WARSTWY TRANSPORTOWEJ

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

4. Algorytmy klienta

Wstęp do programowania 1

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

Serwer współbieżny połączeniowy

Obsługa plików Procesy

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

Unix: programowanie sieciowe

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

Programowanie współbieżne i rozproszone

5. Algorytmy serwera

Pobieranie argumentów wiersza polecenia

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Instytut Teleinformatyki

Uzupełnienie dot. przekazywania argumentów

Serwery współbieżne c.d.

1 Sposób zaliczenia przedmiotu

RULE SET BASED ACCESS CONTROL. Paweł Bylina

Zaawansowane operacje wejścia/wyjścia

Temat zajęć: Obsługa systemu plików.

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

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

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

Buffer Overflow w Windows, symulacja włamania do systemu z wykorzystaniem błędu usługi sieciowej. by h07 (h07@interia.pl)

Warstwa aplikacji. część 1. Sieci komputerowe. Wykład 9. Marcin Bieńkowski

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 4

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

Programowanie Sieciowe 1

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

Przykład. Podaj nazwę domenową hosta a odczytaj jego adres IP, lub odwrotnie:

Zdalne wywołania procedur. Jarosław Kuchta Programowanie Współbieżne

Czy procesor musi się grzać?

Shared memory and messages. Functions. process 0. process 1. program 0. program 0. data 0. data 1. program 1. data 0. data 1.

Transkrypt:

Gniazda BSD

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

socket() Użycie gniazd w transmisji połączeniowej bind() listen() socket() accept() STOP! nawiązanie połączenia connect() read() STOP! żądanie write() write() odpowiedź read() STOP!

Użycie gniazd w transmisji bezpołączeniowej socket() socket() bind() bind() STOP! recv() żądanie send() send() odpowiedź recv() STOP!

#include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int proto); domain AF_INET, AF_UNIX, AF_INET6,... type SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_SEQPACKET,... proto dla domain=af_inet TCP, UDP, IP (dostarczone przez getprotobyname() uchwyt do nowo utworzonego gniazda albo -1 ( errno)

#include <sys/types.h> #include <sys/socket.h> int bind( int sockfd, const struct sockaddr *addr, socklen_t addrlen); sockfd uchwyt skojarzony z gniazdem, dostarczony przez socket() sockaddr wskaźnik na strukturę opisującą usługę, której istnienie serwer ogłasza w systemie (trójka: domena, port, adres IP) adrlen długość struktury j.w. 0 jeśli wykonanie poprawne, -1 w wypadku błędu ( errno)

#include <sys/types.h> #include <sys/socket.h> struct sockaddr { sa_family_t char } sa_family; sa_data[14] struct sockaddr_in { short int sin_family; unsigned short int sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; }

#include <sys/types.h> #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); sockfd sockaddr sockaddr uchwyt skojarzony z gniazdem, dostarczony przez socket() wskaźnik na strukturę opisującą zdalną usługę, do której należy się dołączyć (jak poprzednio) długość struktury j.w. 0 jeśli wykonanie poprawne, -1 w wypadku błędu ( errno)

#include <sys/types.h> #include <sys/socket.h> int listen(int sockfd, int backlog); sockfd backlog uchwyt do gniazda, dostarczony przez socket() rozmiar kolejki, którą będzie utrzymywać system, aby przechowywać żądania kierowane do gniazda 0 jeśli wykonanie poprawne, -1 w wypadku błędu ( errno)

#include <sys/types.h> #include <sys/socket.h> int accept( int sockfd, struct sockaddr *addr, socklen_t *addrlen); sockfd uchwyt do gniazda, na którym spodziewamy się odebrania połączenia addr wskaźnik na strukturę, która zostanie wypełniona adresem usługi, z której nadeszło połączenie addrlen długość utworzonej struktury uchwyt do nowo utworzonego gniazda albo -1 w wypadku błędu ( errno)

#include <sys/types.h> #include <sys/socket.h> ssize_t send( int sockfd, const void *buf, size_t len, int flags); sockfd uchwyt skojarzony z gniazdem,przez które zostanie wysłany komunikat, dostarczony przez socket() buf wskaźnik na bufor z komunikatem len długość wiadomości flags 0, MSG_DONTROUTE, MSG_OOB,... liczba wysłanych bajtów jeśli wykonanie poprawne albo -1 w wypadku błędu ( errno)

#include <sys/types.h> #include <sys/socket.h> ssize_t recv( int sockfd, const void *buf, size_t len, int flags); sockfd uchwyt skojarzony z gniazdem, przez które zostanie odebrany komunikat, dostarczony przez socket() buf wskaźnik na bufor z komunikatem len długość bufora flags 0, MSG_DONTROUTE, MSG_OOB,... liczba odebranych bajtów jeśli wykonanie poprawne albo -1 w wypadku błędu ( errno)

#include <unistd.h> #include <sys/socket.h> int close(int fd); fd uchwyt skojarzony z gniazdem, dostarczony przez socket() 0 jeśli wykonanie poprawne albo -1 w wypadku błędu ( errno)

#include <sys/types.h> #include <sys/socket.h> int inet_aton( const char *cp, struct in_addr *inp); cp wskaźnik na adres IP hosta w postaci znakowej (a.b.c.d) inp wskaźnik na strukturę, w której zostanie umieszczony adres w postaci binarnej 0 jeśli wykonanie poprawne albo -1 w wypadku błędu ( errno)

#include <sys/types.h> #include <sys/socket.h> typedef uint32_t in_addr_t; struct in_addr { in_addr_t s_addr; };

#include <sys/types.h> #include <sys/socket.h> in_addr_t inet_addr(const char *cp); cp wskaźnik na adres hosta (domenowy) w postaci znakowej spakowany adres IP albo -1 w wypadku błędu ( errno) (co rodzi pewien problem...)

#include <sys/types.h> #include <sys/socket.h> char *inet_ntoa(struct in_addr in); cp wskaźnik na adres IP hosta w spakowanej postaci binarnej adres IP w postaci znakowej (a.b.c.d) umieszczony w statycznym buforze (nadpisywanych przy każdym kolejnym wywołaniu)

#include <netdb.h> struct protoent *getprotobyname( const char *name); name łańcuch zawierający nazwę protokołu ( tcp, udp, ip ) wskaźnik na statyczny utworzoną strukturę (nadpisywaną przy kolejnych wywołaniach) opisującą protokół lub NULL w przypadku błędu

#include <netdb.h> struct protoent { char *p_name; /* official protocol name */ char **p_aliases; /* alias list */ int p_proto; /* protocol number */ }

#include <netdb.h> struct protoent *getprotobynumber(int proto); proto numer protokołu wskaźnik na statyczny utworzoną strukturę (nadpisywaną przy kolejnych wywołaniach) opisującą protokół lub NULL w przypadku błędu

#include <netdb.h> struct servent *getservbyname (const char *name, const char *proto); name łańcuch zawierający nazwę usługi (np. pop3 ) proto łańcuch zawierający nazwę protokołu ( tcp, udp, ip ) wskaźnik na statyczny utworzoną strukturę (nadpisywaną przy kolejnych wywołaniach) opisującą daną usługę lub NULL w przypadku błędu

#include <netdb.h> struct servent { char *s_name; /* official service name */ char **s_aliases; /* alias list */ int s_port; /* port number */ char *s_proto; /* protocol to use */ }

#include <netdb.h> struct servent *getservbyport (int port, const char *proto); name numer portu przypisany do usługi (np. 110) proto łańcuch zawierający nazwę protokołu ( tcp, udp, ip ) wskaźnik na statyczny utworzoną strukturę (nadpisywaną przy kolejnych wywołaniach) opisującą daną usługę lub NULL w przypadku błędu

#include <netdb.h> struct hostent *gethostbyname(const char *name); name nazwa hosta w postaci łańcucha (symboliczna lub adres IP) wskaźnik na statyczny utworzoną strukturę (nadpisywaną przy kolejnych wywołaniach) opisującą danego hosta lub NULL w przypadku błędu

#include <netdb.h> struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* alias list */ int h_addrtype; /* host address type */ int h_length; /* length of address */ char **h_addr_list; /* list of addresses */ }

#include <netdb.h> struct hostent *gethostbyaddr( const void *addr, socklen_t len, int type); addr wskaźnik na strukturę opisującą adres IP hosta (np. struct in_addr uzyskany z inet_addr()) len długość (rozmiar) struktury type typ adresu (w naszym przypadku AF_INET) wskaźnik na statyczny utworzoną strukturę (nadpisywaną przy kolejnych wywołaniach) opisującą danego hosta lub NULL w przypadku błędu

#include <sys/types.h> #include <sys/socket.h> int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); sockfd uchwyt do gniazda, którego opcje będą modyfikowane level poziom modyfikacji (SOL_SOCKET) optname stała symboliczna reprezentująca opcję (SO_REUSEADDR) optval wskaźnik na daną reprezentującą nową wartość opcji (najczęściej int) optlen długość danej reprezentującej opcję 0 jeśli wykonanie poprawne albo -1 w wypadku błędu ( errno)

Prosty klient TCP 1/3 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <netdb.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> void err(char *where) { fprintf(stderr, "error in %s: %d\n", where, errno); exit(1); } int main(int argc, char *argv[]) { char *remote = "www.wi.zut.edu.pl"; struct servent *sent; struct protoent *pent; int port; int sock; int result; in_addr_t ipadr; struct sockaddr_in addr; struct hostent *hent; char buf[2048];

Prosty klient TCP 2/3 sent = getservbyname("http", "tcp"); if(sent == NULL) err("getservbyname"); port = sent->s_port; pent = getprotobyname("tcp"); if(pent == NULL) err("getprotobyname"); hent = gethostbyname(remote); printf("host: %s\n", hent->h_name); printf("ip: %s\n", inet_ntoa(*((struct in_addr *)hent->h_addr))); addr.sin_family = AF_INET; addr.sin_port = port; addr.sin_addr = *((struct in_addr *)hent->h_addr); memset(addr.sin_zero, '\0', 8); sock = socket(af_inet, SOCK_STREAM, pent->p_proto); if(sock < 0) err("socket"); result = connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr)); if(result < 0) err("connect");

Prosty klient TCP 3/3 } strcpy(buf, "GET / \r\n\r\n"); write(sock, buf, strlen(buf)); while((result = read(sock, buf, sizeof(buf))) > 0) { buf[result] = '\0'; puts(buf); } close(sock); return 0;