To tylko jedna z 13 stron tej notatki. Zaloguj się aby zobaczyć ten dokument.
Zobacz
całą notatkę
Interfejs gniazd . Gniazda TCP. Gniazda ( sockets ) to abstrakcyjne mechanizmy umożliwiające wykonywanie systemowych funkcji wejścia - wyjścia w odniesieniu do sieci. Gniazda zostały zaprojektowane w Berkeley na potrzeby Unix BSD. Istnieje grupa funkcji systemowych obsługujących gniazda, funkcje te stanowią API ( Application Program Interface ).
Gniazda umożliwiają między innymi przesyłanie danych między procesami działającymi na komputerach w sieci z wykorzystaniem połączeń TCP lub protokołu UDP, przy czym same operacje wysyłania i odbierania danych przypominają zwykłe operacje zapisywania i odczytu z pliku. Gniazdowe struktury adresowe. W wielu funkcjach operujących na gniazdach należy podać wskaźnik do struktury adresowej. Dla różnych rodzin protokołów zdefiniowano różne struktury adresowe. Dla Ipv4 struktura ta nazywa się sockaddr_in . struct sockaddr_in {
uint8_t sin_len; // długość struktury (16)
sa_family_t sin_family; // rodzina adresow: AF_INET
u_int16_t sin_port; // nr portu w tzw. sieciowej kolejności // bajtów
struct in_addr sin_addr; // 32 bitowy adres IP w sieciowej // kolejności bajtów
char sin_zero[8] // nieużywane
}; Adres intrernetowy jest właściwie w strukturze:
struct in_addr {
u_int32_t s_addr; adres IP
}; W różnych systemach definicje mogą się różnić od powyższej. W linuxie sprobuj man 7 ip do wyswietlenia opisu.
Ogólna struktura adresowa gniazda (zdefiniowana w pliku nagłówkowym :
struct sockaddr {
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
};
Założono wykorzystywanie gniazd dla dowolnej rodziny protokołów obsługiwanej przez system operacyjny, dlatego funkcjom przekazuje się wskaźnik do odpowiedniej struktury rzutowany na sockaddr. Funkcje gniazd powstały przed wprowadzeniem do standardu ANSI C void *.
Funkcje przekształcania adresu : inet_aton(), inet_ntoa(), inet_pton(), inet_ntop().
int inet_aton(const char *strptr, struct in_addr *addrptr);
Przekształca adres w notacji „kropkowej” (np. „149.156.65.43”) zapisany jako napis w C na liczbę 32 bitową w sieciowej kolejności bajtów.
Funkcja inet_aton() zwraca 1 jeśli napis był poprawny, 0 jeśi wystąpił błąd.
char *inet_ntoa(struct in_addr inaddr);
Zwraca wskaźnik do napisu w notacji “kropkowej”.
(…)
…(user)){
fprintf(stderr, "%s: blad zapisu",progname);
exit(1);
}
// Dopoki serwer nie zakonczyl pisania czytaj dane do bufora.
// Odpowiedz serwera moze dojsc "w kawalkach".
// Deskryptor pliku 1 uzyty w funkcji write oznacza // standardowe wyjscie.
while ((len=read(s,buf,BUFSIZ))>0)
write(1,buf,len);
// Zamknij gniazdo
close(s);
// Zakoncz z kodem bledu 0
exit(0); }
Przykładowy serwer usługi whois…
… jest informacją dla procesu, że wystąpiło jakieś zdarzenie. Sygnały nazywane są też przerwaniami programowymi. Sygnały są na ogół wysyłane asynchronicznie.
Sygnały są wysyłane z procesu do procesu (również siebie samego) oraz z jądra do procesu.
Gdy kończy się proces potomny, wówczas jądro systemu przesyła do procesu macierzystego sygnał SIGCHLD. Proces potomny staje się zombie (defunct), umożliwiając procesowi macierzystemu pobranie informacji o rozmiarach zasobów użytych przez proces potomny. Aby nie był tworzony zombie należy wywołać funkcję wait() w funkcji obsługującej sygnał SIGCHLD.
signal(SIGCHLD, sig_chld);
….
void sig_chld(int signo)
{
pid_t pid;
int stat;
pid = wait(&stat);
return;
}
Takie rozwiązanie może się jednak zakończyć przerwaniem wykonywania programu (procesu macierzystego), jeśli sygnał nadszedł…
… argc, char * argv[])
{
int s,t; // Deskryptory gniazd
int i; // Zmienna robocza
struct sockaddr_in sa, isa; // Internetowa struktura adresowa gniazda
// Opis w programie klient
struct hostent *hp; // Struktura przechowujaca dane o komputerze
// Opis w programie klient
char *progname; // wskaznik do nazwy programu
char localhost[MAXHOSTNAME+1];// nazwa lokalnego komputera jako napis
progname=argv[0…
... zobacz całą notatkę
Komentarze użytkowników (0)