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 . . . 72 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