• Non ci sono risultati.

Il programma httpd è un server web monothread minimale. Opera aprendo un socket in listening sulla porta 80 e accettando connessioni. Per ogni connes- sione ricevuta eettua il parsing della prima riga estraendone il comando ed il primo argomento. Accetta soltanto il comando GET. Il primo argomento di questo comando è il le che il browser richiede. Questo le viene cercato nella directory /web/. Se presente viene caricato in memoria e spedito al browser. Se invece non è presente viene inviato al browser un errore 404. Alla chiusura della connessione il programma torna ad accettare nuove connessioni. Il codice sorgente schematizzato è mostrato in algoritmo 31.

Algorithm 31 httpd.c #include <printf.h> #include <tcp.h> #include <in.h> #include <socket.h> #include <fs.h> #include <string.h> char buffer[MAXBUFF]; byte * file, cur;

int main (int argc, char *argv[]) {

int sock,ret,newsock,rcount,wcount, addr_len, i, wb; char * ps;

addr.sin_family=AF_INET; addr.sin_port=80;

addr.sin_addr.s_addr=0; addr_len=sizeof(struct sockaddr_in); sock=socket(AF_INET,SOCK_STREAM,0); ret=bind(sock,(struct sockaddr*)&addr,sizeof(addr)); ret=listen(sock,5); while (1) { addr_len=sizeof(struct sockaddr_in); newsock=accept(sock,(struct sockaddr*)(&addr),&addr_len); if (newsock<0) { printf("Error in accept\n"); exit(); } ret=Read(newsock,MAXBUFFER,buffer,&rcount);

if (ret!=ERR_OK) {

printf("Error in reading data from socket\n"); Close(newsock);

} else {

if (strncmp("GET ",buffer,4)) { printf("Not a get request\n"); } else { ps=ExtractFileName(buffer+4); if (! strcmp(ps,"/")) strcpy(ps,"index.htm"); if (*ps=='/') ps++; ret=WebReadFile(ps,&file,&wb); if (ret!=0) {

/* nessun file trovato restituisco 404 */ file=error404; wb=strlen(error404); } rcount=0; cur=file; while (rcount<wb) { ret=Write(newsock,Min(wb-rcount,MAXBUFF),cur,&wcount); if (ret!=0) {

printf("Error in write to socket\n"); break; } cur+=wcount; rcount+=wcount; } if (file!=error404) free(file); file=NULL; } Close(newsock); } 65

B Syscalls

Nome SYSCALL Descrizione

SYS_SIGNAL Trasmette un segnale ad un processo

SYS_SEND_MSG Spedisce un messaggio

SYS_RECV_MSG Riceve un messaggio

SYS_GETB_MSG Alloca un messaggio

SYS_FREE_MSG Libera un messaggio

SYS_PRINT Interfaccia per la stampa a video

SYS_GETPID Restituisce il pid del processo corrente SYS_GETPPID Restituisce il pid del processo padre

SYS_GETTID Restituisce il tid del thread corrente

SYS_FORK Eettua la fork() del processo

SYS_CREATE_PROCESS_ELF Crea un nuovo processo da un'immagine ELF

SYS_CREATE_THREAD Crea un nuovo thread

SYS_DESTROY_THREAD Distrugge un thread

SYS_EXIT Termina il processo corrente

SYS_EXIT_THREAD Termina il thread corrente

SYS_INIT_SEM Inizializza un semaforo

SYS_INIT_BOOL_SEM Inizializza un semaforo booleano

SYS_P_SEM Eettua la P su un semaforo

SYS_BOOL_P_SEM Eettua la P su un semaforo booleano SYS_NBLK_P_SEM Eettua la P non bloccante su un semaforo SYS_NBLK_BOOL_P_SEM Eettua la P non bloccante su un semaforo booleano

SYS_V_SEM Eettua la V su un semaforo

SYS_BOOL_V_SEM Eettua la V su un semaforo booleano

SYS_GETEVENT Richiede o crea un evento

SYS_CLEAREVENT Rilascia o distrugge un evento

SYS_SETEVENT Imposta attributi di un evento

SYS_ESIGNAL Segnala un evento

SYS_EWAIT Attende la segnalazione di un evento

SYS_BRK Richiama la brk() per l'allocazione della memoria del processo

SYS_GETMPSPID Restituisce il pid di MPS

SYS_SETMPSPID Imposta il pid di MPS. Usabile solo una volta

SYSCALL IPC POSIX Descrizione

SYS_MSGGET Richiede una coda di messaggi

SYS_MSGSND Spedisce un messaggio

SYS_MSGRCV Riceve un messaggio

SYS_MSGCTL Operazioni varie su code di messaggi

SYS_SHMGET Richiede una zona di memoria condivisa SYS_SHMAT Attacca una zona di memoria condivisa al processo

SYS_SHMDT Rimuove una zona di memoria condivisa dallo spazio logico del processo SYS_SHMCTL Operazioni varie sulle aree di memoria condivise

Elenco degli algoritmi

1 Descrittore di segmento . . . 5

2 Page Directory Entry . . . 6

3 Page Table Entry . . . 6

4 struct TSS . . . 8

5 struct thread . . . 12

6 struct task . . . 13

7 Strutture dati per le code dello schedulatore . . . 14

8 struct Semaphore . . . 14 9 Primitiva P . . . 16 10 Primitiva V . . . 17 11 struct msg_info . . . 18 12 Chiamata di send_message() . . . 21 13 Invocazione di send_message() . . . 21

14 Struttura Time Sleeper . . . 22

15 Esempio di INITCONF . . . 24

16 Modulo TCP: richiesta del pid di IP . . . 25

17 Modulo TCP: registrazione servizio a MPS . . . 25

18 Formato header Ethernet . . . 45

19 My_Protocol_Addresses[] . . . 46

20 ARP_Table[] . . . 47

21 Tabella Interfaces[] . . . 47

22 Tabella Protocols[] . . . 48

23 struttura tcb . . . 52

24 struct connection e tcp_state . . . 53

25 struct tcp_buffer . . . 55

26 Strutture per la sospensione . . . 56

27 struct wait_event . . . 57

28 netcat.c . . . 61

29 echo.c . . . 62

30 ncdiff.c . . . 63

31 httpd.c . . . 65

Elenco delle gure

1 Paginazione a tre livelli . . . 7

2 Coda dei Thread sospesi su semaforo . . . 15

3 Processi serventi . . . 23

4 Stack TCP/IP . . . 29

5 Router tra Computer A e computer B . . . 30

6 Header IP . . . 31

7 Header TCP . . . 32

8 Three way handshake . . . 33

9 Stati della connessione . . . 35

10 Finestra di ricezione . . . 37

11 Timeout di Ritrasmissione . . . 38

12 Slow Start . . . 39

Riferimenti bibliograci

[1] IA-32 Intel® Architecture Software Developer's Manual, Volume 1: Basic Architecture, pag. 478, ultimo aggiornamento Marzo 2006, http://www. intel.com/design/pentium4/manuals/253665.htm

[2] IA-32 Intel® Architecture Software Developer's Manual Volume 3A: System Programming Guide, Part 1, pag. 636, ultimo aggiornamento Marzo 2006, http://www.intel.com/design/pentium4/manuals/253668.htm

[3] IA-32 Intel® Architecture Software Developer's Manual, Volume 3B: System Programming Guide, Part 2, pag. 530, ultimo aggiornamento Marzo 2006, http://www.intel.com/design/pentium4/manuals/253669.htm

[4] Implementazione della funzione Malloc, Dough Lea, Aprile 2000, http: //gee.cs.oswego.edu/dl/html/malloc.html

[5] Architettura dei Sistemi di Elaborazione, Vol. I, Fondamenti, Firm- ware, Architetture Parallele, F. Baiardi, A. Tomasi, M. Vanneschi, Ed. FrancoAngeli, pag. 541, 1995

[6] Architettura dei Sistemi di Elaborazione, Vol. II, Sistemi Operativi, Mul- tiprocessori, Sistemi Distribuiti, F. Baiardi, A. Tomasi, M. Vanneschi, Ed. FrancoAngeli, pag. 399, 1995

[7] Sistemi Operativi, Piero Maestrini, McGraw-Hill, pag. 605, Luglio 1994 [8] Unix for Programmers and Users, Graham Glass, Prentice Hall

International Editions, pag. 633.

[9] RFC 791, Internet Protocol, J. Postel, pag. 45, Settembre 1981, http: //www.ietf.org/rfc/rfc0791.txt

[10] RFC 792, Internet Control Message Protocol, J. Postel, pag. 21, Settembre 1981, http://www.ietf.org/rfc/rfc0792.txt

[11] RFC 793, Transmission Control Protocol, J. Postel, pag. 85, Settembre 1981, http://www.ietf.org/rfc/rfc0793.txt

[12] RFC 826, Ethernet Address Resolution Protocol: Or converting network protocol addresses to 48.bit Ethernet address for transmission on Ethernet hardware, D.C. Plummer, pag. 10, Novembre 1982, http://www.ietf. org/rfc/rfc826.txt

[13] RFC 1700, Assigned Numbers, J. Reynolds, J. Postel, pag. 230, Ottobre 1994, http://www.ietf.org/rfc/rfc1700.txt

[14] RFC 2001, TCP Slow Start, Congestion Avoidance, Fast Retransmit, and Fast Recovery Algorithms, W. Stevens, pag. 6, Gennaio 1997, http://www. ietf.org/rfc/rfc2001.txt

[15] RFC 2581, TCP Congestion Control, M. Allman, V. Paxson, W. Stevens, pag. 14, Aprile 1999, http://www.ietf.org/rfc/rfc2581.txt

[16] RFC 2582, The NewReno Modication to TCP's Fast Recovery Algorithm, S. Floyd, T. Henderson, pag. 12, Aprile 1999, http://www.ietf.org/rfc/ rfc2582.txt

[17] National Semiconductor Application Note 475, DP8390 Network Interface Controller: An Introductory Guide, pag. 8, Maggio 1993, www.csie.nctu. edu.tw/~ijsung/documents/AN-475.pdf

[18] National Semiconductor DP8390D/NS32490D NIC Network Interface Con- troller, pag. 56, Luglio 1995, http://www.national.com/pf/DP/DP8390D. html

[19] National Semiconductor Application Note 874: Writing Drivers for the DP8390 NIC Family of Ethernet Controllers, pag. 14, Luglio 1993, www. csie.nctu.edu.tw/~ijsung/documents/AN-874.pdf

[20] TCP/IP Tutorial and Technical Overview, IBM RedBooks, pag. 957, Agosto 2001

Documenti correlati