Wersja 2013-04
Wersja 2013-04
Zaawansowane techniki
programowania
Gniazda
Gniazda
Człowiek- najlepsza inwestycja
Zaawansowane techniki programowania
WÄ…tki i procesy
vð
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
vð
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
vð
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
vð
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
vð
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
vð
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
vð
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
vð
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
vð
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
vð
Kolejność wywołań:
żð
Serwer:
«%
socket()
«%
bind()
«%
listen()
«%
accept()
«%
send() / recv()
żð
Klient:
«%
socket()
«%
connect()
«%
send() / recv()
Zaawansowane techniki programowania
Gniazda
vð
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
vð
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
vð
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
vð
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
vð
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
vð
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
vð
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
vð
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
vð
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
vð
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
vð
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
vð
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
vð
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
vð
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
vð
I to by było na tyle ...
«%
Funkcja close()
" Prototyp:
int close(int sockfd);
" W win funkcja ta nazywa siÄ™ closesocket
vð
I jeszcze standard MS:
«%
Inicjacja:
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
«%
SprzÄ…tanie:
WSACleanup();
Zaawansowane techniki programowania
Gniazda
vð
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
vð
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
vð
Przykłady kodu
żð
Klient echo...
Zaawansowane techniki programowania
C++ Socket library
vð
Przykłady kodu
żð
Klient echo...
Zaawansowane techniki programowania
C++ Socket library
vð
Przykłady kodu
żð
Klient echo...
Zaawansowane techniki programowania
C++ Socket library
vð
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
vð
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
vð
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
vð
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
vð
Wysyłanie danych przez gniazdo
żð
Metoda Send tak samo jak normalne send
Zaawansowane techniki programowania
C++ Socket library
vð
Wysyłanie danych przez gniazdo
żð
Program który gada sam ze sobą
Zaawansowane techniki programowania
C++ Socket library
vð
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
vð
Status i adresowanie
«%
Program główny serwera
Zaawansowane techniki programowania
C++ Socket library
vð
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
vð
Co robić z błędami?
żð
Przykładowa implementacja
Zaawansowane techniki programowania
C++ Socket library
vð
Gniazda UDP
«%
W zasadzie tak samo jak gniazda TCP, tyle że korzysta się tylko z
OnRawData
Zaawansowane techniki programowania
C++ Socket library
vð
Gniazda UDP
«%
Implementacja
Zaawansowane techniki programowania
C++ Socket library
vð
Gniazda UDP
«%
Klient
Zaawansowane techniki programowania
C++ Socket library
vð
Gniazda UDP
«%
Serwer
Zaawansowane techniki programowania
C++ Socket library
vð
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
vð
Połączenia szyfrowane
Zaawansowane techniki programowania
C++ Socket library
vð
Połączenia szyfrowane
Zaawansowane techniki programowania
C++ Socket library
vð
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