Zaawansowane techniki programowania 04 Gniazda


Wersja 2013-04
Wersja 2013-04
Zaawansowane techniki
programowania
Gniazda
Gniazda
Człowiek- najlepsza inwestycja
Zaawansowane techniki programowania
WÄ…tki i procesy

WÄ…tki a procesy
żð
Każda uruchomiona instancja programu to proces
żð
Każdy proces ma co najmniej jeden wątek
żð
Każdy wątek musi być przypisany do jakiegoś procesu

Zagadnienia synchronizacji
«%
Przypuśćmy, że sekcja kodu modyfikuje jakieś dane w kilku
krokach (nie jest to operacja atomowa. W międzyczasie
uruchamiany jest inny wątek (inny fragment kodu), który
próbuje odczytać te same dane. Ze względu na to, że dane są
w trakcie modyfikacji przez pierwszy wÄ…tek, ich stan jest
niespójny - wynik działania drugiego wątku może być
nieoczekiwany. Dodatkowo, jeśli drugi wątek spróbuje
zmodyfikować te same dane, staną się one permanentnie
niespójne i przestaną być użyteczne dla któregokolwiek z
wątków. Z tego względu wspólne dane powinny być
zabezpieczone
Zaawansowane techniki programowania
WÄ…tki i procesy

Zagadnienia synchronizacji
żð
Blokada (lock)
«%
Każdy wątek który chce uzyskać dostęp do chronionego
zasobu musi najpierw uzyskać pozwolenie  założyć blokadę.

Najprostsza implementacja  binarny semafor  nie czyni rozróżnienia
czy dostęp ma być do odczytu czy do zapisu.

Bardziej zaawansowane implementacje pozwalają na rozróżnianie typów
dostępu.
«%
Niezależnie od dostępu  blokady dzielą się także ze względu
na sposób powstrzymywania wątku

Najprościej jest wstrzymać wykonanie  lecz w tym przypadku by blokada
działała efektywnie należy zapewnić krótkie wykonanie kodu objętego
blokadÄ…
«%
Zazwyczaj implementacja blokad jest po stronie systemu operacyjnego
i jest wspierana rozwiązaniami sprzętowymi  poprzez wykonywanie
tzw. instrukcji atomowych (niepodzielnych)
«%
Większy problem jest w systemach wieloprocesorowych  ale to nie
nasz ból głowy ;)
Zaawansowane techniki programowania
WÄ…tki i procesy

Zagadnienia synchronizacji
żð
Blokada (lock)
«%
Uważajcie  coś takiego nie zadziała:
if (lock == 0) { lock = myID; }
«%
Nie zadziała  bo więcej niż jeden wątek może testować zmienną lock
w tym samym czasie.
Zaawansowane techniki programowania
WÄ…tki i procesy

Zagadnienia synchronizacji
żð
Sekcja krytyczna
«%
W nomenklaturze standardowej  fragment kodu który
powinien być zabezpieczony jakąś blokadą
«%
W nomenklaturze Windows  binarny, nierekurencyjny semafor.

Współbieżny fragment kodu programu, w którym korzysta się z zasobu
dzielonego, a co za tym idzie w danej chwili może być wykorzystywany
przez co najwyżej jeden wątek. System operacyjny dba o synchronizację,
jeśli więcej wątków żąda wykonania kodu sekcji krytycznej, dopuszczany
jest tylko jeden wątek, pozostałe zaś są wstrzymywane. Dąży się do
tego, aby kod sekcji krytycznej był krótki - by wykonywał się szybko.
«%
Sekcje krytyczne realizuje wykorzystujÄ…c API systemu
operacyjnego i są ważne jedynie w obrębie jednego procesu 
nie mogą synchronizować dostępu do zasobu z wielu procesów.
«%
Nazwa bywa mylÄ…ca  tylko w Windows sekcja krytyczna to
CriticalSection. W innych systemach jest to nienazwany mutex.
Zaawansowane techniki programowania
WÄ…tki i procesy

Zagadnienia synchronizacji
żð
Mutex ang. Mutual Exclusion, wzajemne wykluczanie
«%
element stosowany w programowaniu służący do kontroli
dostępu do zasobów niemożliwych do współdzielenia, bardziej
zaawansowana forma blokady
«%
Implementacja muteksu musi spełniać następujące warunki:
" Niedoprowadzanie do pełnej blokady

Wielu chce uzyskać dostęp to w końcu któryś musi go uzyskać
" Niedoprowadzanie do zagłodzenia  tzw uczciwość:

uczciwość słaba, jeśli proces ciągle zgłasza żądanie, to w końcu zostanie
dopuszczony do sekcji krytycznej,

uczciwość mocna, gdy proces zgłasza żądanie określoną liczbę razy, to
zostanie w końcu dopuszczony do sekcji krytycznej,

oczekiwanie liniowe, jeśli proces zgłasza żądanie, będzie dopuszczony do
sekcji krytycznej nie pózniej niż po tym jak każdy inny proces zostanie
obsłużony jeden raz,

FIFO, tak jak w przypadku kolejki (bufora FIFO  pierwszy wszedł,
pierwszy wyjdzie), procesy zostaną obsłużone w kolejności zgłoszenia
żądań.
Zaawansowane techniki programowania
WÄ…tki i procesy

Zagadnienia synchronizacji
żð
Mutex ang. Mutual Exclusion, wzajemne wykluczanie
«%
Mutex może działać w kilku trybach:

Pełne objęcie zasobu w posiadanie jest konieczne jedynie przy zapisie.

Można dać równoległy dostęp do danych do odczytu dla wielu wątków

Mutex może być rekurencyjny  pozwalać na wielokrotne  zajęcie go
poprzez ten sam wÄ…tek
Zaawansowane techniki programowania
WÄ…tki i procesy

Zagadnienia synchronizacji
żð
Zdarzenie (Event)
«%
Metoda komunikacji między wątkami
«%
Wątki mogą oczekiwać na zdarzenie
«%
PojawiajÄ…ce siÄ™ zdarzenie wznawia wykonywanie wszystkich
wątków oczekujących
żð
RozwiÄ…zania specyficzne
«%
Qt  sygnały i sloty
" Mechanizm sygnałów i slotów jest bezpieczny pod względem
wielowątkowości
Zaawansowane techniki programowania
Gniazda

SkÄ…d pochodzÄ…?
żð
Unix-y
«%
Gniazdo to sposób wymiany informacji przez programy
«%
W oryginale  deskryptor pliku
«%
socket() - zwraca desktyptor, send() / recv() - wysyła i odbiera
«%
Można też korzystać z klasycznych read() / write()
«%
Dwa typy:
" Gniazdo datagramowe SOCK_DGRAM (bezpołączeniowe, UDP 
wysłane  a, b mogą dotrzeć w tej kolejności, mogą w odwrotnej,
mogą nie dotrzeć wcale)
" Gniazdo strumieniowe SOCK_STREAM (godne zaufania
dwukierunkowe połączenie strumieniowym. Wysłane "a, b" dotrą na
pewno w kolejności "a, b"
«%
Deskryptor jest typu int
«%
Informacje o adresie sÄ… przechowywane w strukturach
Zaawansowane techniki programowania
Gniazda

Kolejność wywołań:
żð
Serwer:
«%
socket()
«%
bind()
«%
listen()
«%
accept()
«%
send() / recv()
żð
Klient:
«%
socket()
«%
connect()
«%
send() / recv()
Zaawansowane techniki programowania
Gniazda

Adresowanie
żð
Informacje o adresie sÄ… przechowywane w strukturach:
" struct sockaddr {
unsigned short sa_family; // rodzina adresów
char sa_data[14]; // 14-bajtowy adres
};
" sa_family - AF_INET
" Bardziej dokładnie:
" struct sockaddr_in {
short int sin_family; // rodzina adresów
unsigned short int sin_port; // numer portu
struct in_addr sin_addr; // adres internetowy
unsigned char sin_zero[8]; // dopełnienie rozmiaru sockaddr
};
" Sam adres:
" struct in_addr {
unsigned long s_addr; // to ma rozmiar 32 bitów, lub 4 bajtów
};
myaddr.sin_addr.s_addr = inet_pton("10.12.110.57");
Zaawansowane techniki programowania
Gniazda

Adresowanie
żð
Konwersja z Network na Host Byte Order
" Są dwa typy, które można konwertować: short (dwa bajty) i long (cztery
bajty). Poniższe funkcje działają równie dobrze dla wariacji unsigned.
Nazwy funkcji tworzone są wg schematu, przykładowo liczba short z
kolejności bajtów hosta na sieciową kolejność bajtów: "h" dla "Host",
następnie "to", potem "n" dla "Network" i "s" dla "short": h-to-n-s, lub
htons() (czyt. "Host to Network Short"). Można używać każdej
kombinacji "n", "h", "s" i "l" (oprócz tych głupich):

htons() -- "Host to Network Short"

htonl() -- "Host to Network Long"

ntohs() -- "Network to Host Short"

ntohl() -- "Network to Host Long"
" "Co mam zrobić, jeśli muszę zmienić kolejność bajtów w char?" - "Eee,
nie ważne".
" Twoja maszyna już używa Network Byte Order (Apple na PowerPC) - nie
trzeba wywoływać htonl() na adresach IP. Racja - ALE pisz przenośnie!
Zaawansowane techniki programowania
Gniazda

Adresowanie
żð
Konwersja z Network na Host Byte Order
" Dlaczego sin_addr oraz sin_port muszą być w Network Byte Order w
strukturze struct sockaddr_in, podczas gdy sin_family nie?
sin_addr oraz sin_port są kapsułkowane w pakiecie w warstwach
odpowiednio IP i UDP. Stąd muszą być w Network Byte Order. Pole
sin_family jest używane tylko przez jądro do określenia jaki typ adresu
przechowuje struktura, więc musi być w Host Byte Order.
Zaawansowane techniki programowania
Gniazda

Adresowanie
żð
Adresy IP oraz jak sobie z nimi radzić
" Jest kilka funkcji, która pozwalają na manipulowanie adresami IP.
" Mamy strukturÄ™ struct sockaddr_in ina oraz adres IP
"10.12.110.57", który chcemy przechowywać w niej. Funkcja która
zamienia adres IP na notację numerowo-kropkową i składuje go w
unsigned long jest inet_aton(). Przypisanie adresu IP wyglÄ…da
tak:

myaddr.sin_addr.s_addr = inet_pton("10.12.110.57");
" Zauważ, że inet_aton() zwraca adres w Network Byte Order -- nie
musisz wywoływać htonl().
" Powyższy kawałek kodu nie jest zbyt dobry, ponieważ nie ma tam
sprawdzania błędów. Zauważ, że inet_addr() zwraca -1 w
przypadku błędu. Binarnie odpowiada to adresowi IP
255.255.255.255 - adres rozgłoszeniowy!
" Zamiast inet_addr() w *nix-ach lepiej skorzystać z inet_aton()
("aton" oznacza "ascii to network" (zamień ascii na adres sieciowy))
Zaawansowane techniki programowania
Gniazda

Adresowanie
żð
Adresy IP oraz jak sobie z nimi radzić
" Poniżej jest przykładowe użycia wstawiania danych do struct
sockaddr_in

struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
inet_aton("10.12.110.57", &(my_addr.sin_addr));
memset(&(my_addr.sin_zero), '\0', 8);
" inet_aton(), w przeciwieństwie do praktycznie każdej funkcji
operującej na gniazdach, zwraca wartość niezerową w przypadku
powodzenia oraz zero w przypadku błędu. Adres IP jest
umieszczany w zmiennej przekazywanej jako drugi parametr.
" Niestety, nie wszystkie platformy dostarczajÄ… inet_aton()
" Odwrotnie  mamy struct in_addr i chcemy wyświetlić to w
formacie liczb rozdzielonych kropkami? W tym przypadku
korzystamy z inet_ntoa() ("ntoa" oznacza "network to ascii" -
zamień adres sieciowy na ciąg znaków ascii)

cout << inet_ntoa(myaddr.sin_addr);
Zaawansowane techniki programowania
Gniazda

Adresowanie
«%
inet_ntoa() przyjmuje struct in_addr jako swój argument.
Zauważcie, że funkcja ta zwraca wskaznik do typu char. Wynik
jej działania jest umieszczany w statycznie alokowanym
buforze w obrębie funkcji inet_ntoa() , tak więc za każdym
wywołaniem funkcji inet_ntoa() nadpisze ona ostatni adres IP
" Przykład:

char *a1, *a2;
a1 = inet_ntoa(ina1.sin_addr); // tu jest 192.168.4.14
a2 = inet_ntoa(ina2.sin_addr); // tu jest 10.12.110.57
cout << "address 1: " << a1 << endl;
cout << "address 2: " << a2 << endl;
" Powyższe da wynik:
address 1: 10.12.110.57
address 2: 10.12.110.57
" Jeśli musisz zachować adres, użyj strcpy(), by wynik skopiować do
własnego bufora.
Zaawansowane techniki programowania
Gniazda

Deskryptor
«%
Funkcja socket(). Prototyp:

int socket(int domain, int type, int protocol);
" Argumenty:

Pierwszy, domena powinien być ustawiony na "PF_INET", tak jak w
struct sockaddr_in powyżej (lub AF_INET  ale nie wskazane).

Następny parametr, typ, mówi jaki jest to typ gniazda: SOCK_STREAM
lub SOCK_DGRAM.

W końcu, protokol ustawia się na 0, żeby pozwolić funkcji socket()
wybrać właściwy protokół bazując na parametrze typ. (Uwagi: jest dużo
więcej typów, które mogą być wstawione jako domena niż tutaj
napisałem. Macie też większy wybór co do parametru type niż tutaj
napisałem  dokumentacja na necie)
" Funkcja socket() zwraca po prostu deskryptor gniazda, który można
pózniej użyć w innych wywołaniach systemowych, lub -1 (w win
stałą INVALID_SOCKET) w przypadku błędu. W drugim przypadku
zmienna globalna errno jest ustawiana na wartość błędu.
Zaawansowane techniki programowania
Gniazda

Deskryptor
«%
Dlaczego "PF_INET a nie  AF_INET ?.
" Dawno, dawno temu, myślano, że prawdopodobnie rodzina adresów (za
tym terminem stoi "AF" w "AF_INET") może obsługiwać wiele
protokołów, do których odwoływano się za pomocą ich rodziny
protokołów (za tym terminem stoi właśnie to "PF" w "PF_INET"). Jednak
tak się nie stało.
" Prawidłową rzeczą jest użycie AF_INET w struct sockaddr_in oraz
PF_INET w wywołaniu socket(). Jednak w praktyce możesz używać
AF_INET gdziekolwiek (teoretycznie).
Zaawansowane techniki programowania
Gniazda

PowiÄ…zanie gniazda z adresem
«%
Funkcja bind()
" Prototyp:

int bind(int sockfd, struct sockaddr *addr, int addrlen);
" Parametry: sockfd zwrócony z socket(), addr to wskaznik na adres,
addrlen to wielkość struktury z adresem.
" część procesu pobierania własnego adresu IP i/lub portu może być
zautomatyzowane:

myaddr.sin_port = htons(0); // losowy nieużywany port

myaddr.sin_addr.s_addr=htonl(INADDR_ANY); // mój adres IP
" bind() również zwraca -1 (w win SOCKET_ERROR) w przypadku
błędu i ustawia odpowiednio errno na wartość błędu.
" Inną rzeczą wartą podkreślenia jest prawidłowe wybranie numeru
portu. Wszystkie porty poniżej 1024 są ZAREZERWOWANE
(przynajmniej w *nix-ach) Można używać tylko portów powyżej tej
liczby, aż do 65535 (zakładając, że nie są one już zajęte przez inny
program).
Zaawansowane techniki programowania
Gniazda

Nasłuchiwanie  call me baby &
«%
Funkcja listen()
" Prototyp:

int listen(int sockfd, int backlog);
" Parametry:

sockfd zwrócony z socket(),

backlog ilość dozwolonych połączeń oczekujących w kolejce. Połączenia
przychodzące będą czekały dopóki każde z osobna nie zostanie
zaakceptowane ( accept()). Większość systemów po cichu ogranicza tą
liczbÄ™ do 20. Ustawia siÄ™ na mniej (5-10).
" Jeśli nie było wcześniej wywołanego bind  system wybierze port sam
(i nie powie jaki to port)
" listen() również zwraca -1 (w win SOCKET_ERROR) w przypadku błędu
i ustawia odpowiednio errno na wartość błędu
Zaawansowane techniki programowania
Gniazda

Przyjęcie połączenia
«%
Funkcja accept()
" Prototyp:

int accept(int sockfd, void *addr, int *addrlen)
" Parametry:

sockfd zwrócony z socket(),

addr  wskaznik na lokalną strukturę, w której zamieszczone zostaną dane
adresowe połączenia (kto się łączy)

addrlen  długość (wielkość) struktury addr
" Przy akceptowaniu połączenia tworzone jest nowe gniazdo z nowym
portem. Gniazdo nasłuchujące pozostaje niezmienione, natomiast z
nowego korzystamy do wysyłania / odbierania danych.
" zwraca -1 (w win SOCKET_ERROR) w przypadku błędu i ustawia
odpowiednio errno na wartość błędu
Zaawansowane techniki programowania
Gniazda

Nawiązanie połączenia
«%
Funkcja connect()
" Prototyp:

int connect(int sockfd, sockaddr *addr, int addrlen);
" Parametry:

sockfd zwrócony z socket(),

addr  zawiera adres docelowy połączenia (z kim się łączy)

addrlen  długość (wielkość) struktury addr
" Bind może (ale nie musi) być wywołane przed connect. Jeśli
wywołamy bind  nie musimy podawać adresu.
" zwraca -1 (w win SOCKET_ERROR) w przypadku błędu i ustawia
odpowiednio errno na wartość błędu
Zaawansowane techniki programowania
Gniazda

Wysyłanie / odbieranie (strumień)
«%
Funkcje send() / recv()
" Prototyp:

int send(int sockfd, const void *msg, int len, int flags);

int recv(int sockfd, void *buf, int len, int flags);
" Parametry:

sockfd zwrócony z socket(),

msg  dane do wysłania

buf  bufor na dane odbierane

len  długość danych do wysłania / długość bufora do odbierania danych

flags  opcjonalne flagi wysyłania
" send zwraca ilość bajtów które udało się wysłać (nie musi udać się
wysyłanie wszystkiego). W przypadku błędu zwracane jest -1 (w win
SOCKET_ERROR)
" recv zwraca tak jak send, dodatkowo  0 jest zwracane jeśli druga
strona zamknie połączenie.
" Czasem konieczne jest cykliczne wysyłanie / odbieranie danych.
Zaawansowane techniki programowania
Gniazda

Wysyłanie / odbieranie (datagramy)
«%
Funkcje send() / recv()
" Prototyp:

int sendto(int sockfd, const void *msg, int len, int flags,
const struct sockaddr *to, int tolen);

int recvfrom(int sockfd, void *buf, int len, int flags, struct
sockaddr *from, int *fromlen);
" Parametry  jak w send / receive + adresy:

Adresy umożliwają wysyłanie danych bez połączenia
" Nawet połączone gniazda datagramowe korzystają z UDP 
połączenie jest tylko informacją, w jego trakcie nie są wymieniane
żadne komunikaty (w przeciwieństwie do połączenia
strumieniowego).
Zaawansowane techniki programowania
Gniazda

I to by było na tyle ...
«%
Funkcja close()
" Prototyp:

int close(int sockfd);
" W win funkcja ta nazywa siÄ™ closesocket

I jeszcze standard MS:
«%
Inicjacja:

WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
«%
SprzÄ…tanie:

WSACleanup();
Zaawansowane techniki programowania
Gniazda

Więcej informacji:
żð
Windows:
«%
http://msdn.microsoft.com/en-us/library/ms738545%28v=VS.85%29.aspx
żð
*nix-y:
«%
http://regedit.gamedev.pl/Mirror/Beej_s%20Guide%20to%20Network%20Programming%20PL/htm
l/intro.html
Zaawansowane techniki programowania
C++ Socket library

C++ Socket library
żð
Na licencji GPL
«%
http://www.alhem.net/Sockets/index.html
«%
Podstawowa obsługa gniazd
«%
Wspiera Ipv6, szyfrowanie połączenia, protokół http,
zaawansowaną obsługę błędów
«%
Działa na Linux-ach, Windows i MacOS
«%
Jest obiektowa  gniazdo to obiekt
«%
Jest sterowana zdarzeniami  wyjście z select() jest kierowane do
odpowiedniego gniazda i odpowiedniej metody:

Socket::OnRead()

Socket::OnWrite()

Socket::OnConnect()

Socket::OnAccept()
«%
Lista aktywnych gniazd jest przechowywana w klasie
SocketHandler
Zaawansowane techniki programowania
C++ Socket library

Przykłady kodu
żð
Klient echo...
Zaawansowane techniki programowania
C++ Socket library

Przykłady kodu
żð
Klient echo...
Zaawansowane techniki programowania
C++ Socket library

Przykłady kodu
żð
Klient echo...
Zaawansowane techniki programowania
C++ Socket library

Przykłady kodu
żð
Klient echo...
" Open  metoda która łączy z innym
hostem / programem. Po połączeniu
wywoływane jest OnConnect().
SetDeleteByHandler() ustawia tryb
kasowania po użyciu w sposób
automatyczny.
" Obiekt reprezentujÄ…cy gniazdo jest
dodawany do handler-a poprzez
metodę Add(). Bezpośrednio po dodaniu
obiekt nie jest jeszcze widoczny na
liście obsługiwanych. Dlatego jest
pierwsze wywołanie Select przed
GetCount().
" Pętla while będzie działała dopóki
SocketHandler nie skasuje wszystkich
dodanych do niego gniazd.
Zaawansowane techniki programowania
C++ Socket library

Przykłady kodu
żð
echo serwer
" To samo gniazdo (klasa gniazda) może
być wykorzystana w serwerze
" W przypadku serwera potrzebne jest
dodatkowe gniazdo nasłuchujące.
" Tutaj tym gniazdem jest
ListenSocket (szablon
specjalizowany typem gniazda
wykorzystywanego przy nadejściu
połączenia)
" Gniazdo nasłuchujące łączone jest z
portem poprzez metodÄ™ Bind().
" Połączenia przychodzące są
akceptowane przez ListenSocket, po
czym automatycznie tworzony jest
obiekt obsługi gniazda i dodawany do
SocketHandler.
Zaawansowane techniki programowania
C++ Socket library

Buforowanie
żð
Domyślnie biblioteka C++ Socket Library buforuje
przychodzÄ…ce dane
«%
Chcemy uniknąć buforowania  metoda OnRawData():
Implementacja
Nagłówek
Zaawansowane techniki programowania
C++ Socket library

Buforowanie
żð
Działanie w przypadku protokołu opartego na liniach (np.
HTTP)
" Dane przychodzące są buforowane do nadejścia znaku końca linii
Implementacja
Nagłówek
" Wywoływana jest metoda OnLine
Zaawansowane techniki programowania
C++ Socket library

Wysyłanie danych przez gniazdo
żð
Metoda Send  tak samo jak normalne send
Zaawansowane techniki programowania
C++ Socket library

Wysyłanie danych przez gniazdo
żð
Program który gada sam ze sobą
Zaawansowane techniki programowania
C++ Socket library

Status i adresowanie
«%
Klasa która ma służyć jako serwer  obsługuje tylko zdarzenie
OnAccept. Kilka linijek informacji o samym sobie.
Implementacja
Nagłówek
Zaawansowane techniki programowania
C++ Socket library

Status i adresowanie
«%
Program główny serwera
Zaawansowane techniki programowania
C++ Socket library

Co robić z błędami?
żð
Zapisywać ...
" Do włączenia / wyłączenia logowania wykorzystywana jest klasa StdLog.
" Mamy też klasę StdoutLog do wykorzystania jako przykład praktyczny
dla StdLog.
" Tylko jedna metoda jest zaimplementowana (error) wywoływana przez
bibliotekę zawsze jak stanie się coś złego.
" By logi nie szły  w powietrze należy utworzyć obiekt klasy pochodnej
do StdLog i zarejestrować go w SocketHandler.
" Przykład dalej to serwer echa z zaimplementowanym
przechwytywaniem błędów.
Zaawansowane techniki programowania
C++ Socket library

Co robić z błędami?
żð
Przykładowa implementacja
Zaawansowane techniki programowania
C++ Socket library

Gniazda UDP
«%
W zasadzie tak samo jak gniazda TCP, tyle że korzysta się tylko z
OnRawData
Zaawansowane techniki programowania
C++ Socket library

Gniazda UDP
«%
Implementacja
Zaawansowane techniki programowania
C++ Socket library

Gniazda UDP
«%
Klient
Zaawansowane techniki programowania
C++ Socket library

Gniazda UDP
«%
Serwer
Zaawansowane techniki programowania
C++ Socket library

Połączenia szyfrowane
" Potrzebna jest biblioteka OpenSSL
" Trzeba wygenerować certyfikaty (lub kupić jak kto bogaty)
" Do działania SSL w TcpSocket wystarczy wywołać tylko jedną metodę
InitSSLClient.
" Dla serwera wywoływana jest metoda InitSSLServer.
" Klient wywoła InitializeContext gdzie przekazuje się typ szyfrowania
(domyślnie SSLv23). Jeśli nie chcemy tego zmieniać  nie musimy
nadpisywać InitSSLClient
" Serwer też wywoła InitializeContext, lecz z większą liczbą parametrów.
Do działania potrzebna będzie nazwa pliku z kluczem / certyfikatem,
oraz hasło, i  podobnie jak w przypadku klienta  metoda szyfrowania.
" Włączenie SSL sprowadza się jeszcze do wywołania EnableSSL() - może
być w konstruktorze, może w metodzie Init(). W konstruktorze
zazwyczaj wywołuje się EnableSSL gdy wszystkie połączenia są
szyfrowane, w Init  gdy tylko część z nich
Zaawansowane techniki programowania
C++ Socket library

Połączenia szyfrowane
Zaawansowane techniki programowania
C++ Socket library

Połączenia szyfrowane
Zaawansowane techniki programowania
C++ Socket library

C++ Socket Library
żð
Za
«%
Darmowa, w pełni otwarta, z kompletem kodu zródłowego.
«%
Wieloplatformowa (Windows, *nix, MacOS)
«%
Zawiera komplet zadań do obsługi gniazd
«%
Zintegrowana z bibliotekÄ… szyfrujÄ…cÄ…
«%
W miarę szybka  choć nie optymalna
«%
Obsługuje IP v. 6.
żð
Przeciw
«%
Tylko gniazda  i nic ponad to.
«%
Problemy z kompilacją  zawsze i wszędzie
«%
Nie sprawdzana na solarisach i MacOS  mimo że porty istnieją
żð
Do czego
«%
Prototypów programów
«%
Programów bez GUI lub z GUI szczątkowym


Wyszukiwarka

Podobne podstrony:
MS Access 2000 PL Zaawansowane techniki programowania
MS Access 97 PL Zaawansowane techniki programowania
Zaawansowane techniki programowania 01 Składnia C
Zaawansowane techniki programowania 03 Szablony
Debugowanie NET Zaawansowane techniki diagnostyczne?bnet
Ćwiczenie nr 14 – Zaawansowane możliwości programu
technik budownictwa11[04] Z2 01 u Wykonywanie fundamentów
Podstawy Programowania 04 Programowanie Obiektowe
technik budownictwa11[04] Z3 04 u
Inkscape Zaawansowane funkcje programu
technik budownictwa11[04] O1 01 u

więcej podobnych podstron