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