Sockety

TCP/UDP - port

IPv4/IPv6 - adresy

Gniazda strumieniowe(polaczeniowe)- zapewnia dwukierunkowy, wiarygodny, sekwencyjny przeplyw danych bez strat duplikatow, NIE zachowuje granic miedzy rekordami

Gniazda datagramowe(bezpolaczeniowe)- zapewnia dwukierunkowy przeplyw danych, bez gwarancji co do wiarygodnosci, sekwencji i powielania. W gniazdach sa zachowane granice miedzy rekordami.

Ganiazda podstawowe- implementowanie nowych protokolow.

Gdyby bylo za mala miejsc to wyjeb w pierwszej kolejnosci {

Zachowana kolejnosc uzycia funkcji:

int socket(int domain, int type, int protocol);

Wywołując je podajemy przestrzeń nazw (namespace, lub domain), typ połączenia jakie chcemy uzyskać i protokół.

Jeśli jako trzeci parametr wpiszemy 0 system sam wybierze protokół odpowiedni dla danej pary przestrzeń - typ.

int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);

Jako pierwszy paramet przekazujemy deskryptor socketa, który chcemy dowiązać, a jako drugi strukturę z opcjami. Jej typ jest zależny od używanego socketa (PF_INET, czy PF_UNIX), więc przez trzeci parametr przekazujemy jej rozmiar.

int listen(int s, int backlog);

gdzie s jest deskryptorem gniazda, a backlog określa maksymalną długość kolejki połączeń oczekujących na akceptację.

int accept(int s, struct sockaddr *addr, socklen_t *addrlen);

s - socket na którym nasłuchujemy

addr - struktura która zostanie wypełniona danymi dotyczącymi przychodzącego połączenia addrlen - wskaźnik do rozmiaru struktury addr

int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

sockfd - socket za pomocą którego nawiązujemy połączenie

serv_addr - struktura opisująca adres serwera (sockaddr_un lub sockaddr_in)

addrlen - rozmiar struktury adresu

int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);

int recv(int s, void *buf, size_t len, int flags);

s to socket z którego czytamy,

buf jest jakimś buforem na przychodące dane,

len maksymalną długością

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

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

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

s - socket (jak poprzednio)

msg - wiadomość do wysłania (w powyższym przykładzie tekst)

len - rozmiar wiadomości

flags - flagi - normalnie 0

to - struktura zawierająca adress docelowy, typ został już omówiony przy bind i recvfrom

tolen - długość powyższej struktury

int shutdown(int s, int how);

int close(int s);

s - socket

}

T -tcp, U -udp

Serwer(TU) -> socket(TU) -> bind(TU) -> recevfrom(U)/ sendto(U) -> listen(T) -> accept(T) -> recev(T)/send(T)

Klient(TU) -> socekt(TU) -> bind(U) -> sendto(U)/recevfrom(U) -> connect(T) -> send(T)/recev(T)

IAMP

RFC 2060, TCP 143

Atrybuty

- nr. wiadomosci

- nr. sekwencji

- flaga

- data wewnetrzna

- size

- struktura koperty

- struktura ciala

Stany serwera

- Non Authenticated

- Authenticated State (wybor INBOXA)

- Selected State

- Logout

Komendy

Noop - podtrzymanie polaczenia

Logout - wylogowanie

Non Authenticated - poprawienie metody szyfrowania

Login - logowanie z haslem

Select - wybor rozkazu

Delete - kasuje skrzynke

Rename - zmiana nazwy

Create - select state

Close - wszystkie wiadomosci maja flagi deleted

Search - wyszukanie wiadomosci

Fetch - pobranie wiadomosci

Store - manipuluje flagami

Copy - kopiowanie

Bye - rozlaczenie