Számítógép labor V. Egyszer Web szerver. Dokumentáció. Készítette: Ács Gergely (K4C03M) 2003.04.29



Hasonló dokumentumok
URL-LEL ADOTT OBJEKTUM LETÖLTÉSE (1) URL-LEL ADOTT OBJEKTUM LETÖLTÉSE

Rétegezett architektúra HTTP. A hálózatfejlesztés motorját a hálózati alkalmazások képezik. TCP/IP protokoll készlet

Számítógépes hálózatok I.

Számítógépes hálózatok

ERserver. iseries. Szolgáltatási minőség

EMTP, EGY ÚJ LEVELEZÕ PROTOKOLL ÉS IMPLEMENTÁCIÓJA

Dr. Varga Imre. Socket-programozás. C nyelven

15. Programok fordítása és végrehajtása

WWW Kliens-szerver Alapfogalmak Technológiák Terv. Web programozás 1 / 31

A JAVA FUTTATÁSAKOR ELŐFORDULÓ HIBA-

Programozás II. Fájlkezelés

P-GRADE fejlesztőkörnyezet és Jini alapú GRID integrálása PVM programok végrehajtásához. Rendszerterv. Sipos Gergely

Socket programozás Példák

Hálózati architektúrák laborgyakorlat

eseményvezérelt megoldások Vizuális programozás 5. előadás

Az időhöz kötődő parancsok

Dr. Varga Imre Debreceni Egyetem, Informatikai Kar. Socket-programozás. C nyelven, Linux alatt

Számítógépes hálózatok

Általános Szerződési Feltételek

.NET alapszolgáltatások 2.

Statisztikai alap kia.hu (2005)

IBM Systems - iseries. Hálózat: Telnet V5R4

ERserver. iseries. Telnet

Statisztikai alap kia.hu (2006)

A SZOFTVER TELEPÍTÉSE ELŐTT TELEPÍTÉS WINDOWS KÖRNYEZETBEN TELEPÍTÉS MACINTOSH KÖRNYEZETBEN HIBAKERESÉS

Book Template Title. Author Last Name, Author First Name


applikációs protokollok

Bevezetés a C++ programozási nyelvbe

Számítógép-hálózatok: 4. Labor. TCP kliens. A gyakorlat célja:

Bosch Recording Station. Telepítési kézikönyv

Alapfogalmak, WWW, HTTP

Számítógépes hálózatok

1. Bevezető. 2. IP cím és szolgáltatások felderítése

Elektronikus dokumentumtárolási (EDT) szolgáltatás

SECPORTAL FELHASZNÁLÓI KÉZIKÖNYV

KIS. KELER Zrt. Az STP KID megvalósítása. KELER Internetwork System

Kommunikáció. Folyamatok közötti kommunikáció. Minden elosztott rendszer alapja

TELJESKÖRŰ ÜGYFÉLAZONOSÍTÁSI SZOLGÁLTATÁSOK

Statisztikai alap (2006) - main

SAP vállalatirányítási rendszer alapjai

- láda- vagy játékleírásból láda/játéklistába visszatérve nem a lista elejére ugrik, hanem ugyanoda, ahol voltunk a listában

Számítógépes Hálózatok GY 3-4.hét

Szálak szinkronizálása (Ro- Sincronizarea threadurilor)

Számítógépes Hálózatok. 4. gyakorlat

Tűzfal megoldások. ComNETWORX nap, I. 30. ComNETWORX Rt.

Számítógép kártevők. Számítógép vírusok (szűkebb értelemben) Nem rezidens vírusok. Informatika alapjai-13 Számítógép kártevők 1/6

Csatlakozás a rendszerhez System i navigátor feladatok a weben

AIX 6.1. IBM Systems Director Console for AIX

A Számítógépek hardver elemei

Számítógépes Hálózatok. 3. gyakorlat

Java Servlet technológia

Hello World Servlet. Készítsünk egy szervletet, amellyel összeadhatunk két számot, és meghívásakor üdvözlőszöveget ír a konzolra.

Rövidített felhasználói kézikönyv. H.264 ( 4/8/16 csatornás) Digitális video rögzítő

Számítógépes Hálózatok. 9. gyakorlat

Osztott alkalmazások fejlesztési technológiái Áttekintés

IBM i. Szerviz és támogatás 7.1

Számítógépes Hálózatok. 3. gyakorlat

Operációs rendszerek. 3. előadás Ütemezés

NARACOM INFORMATIKAI KFT. ÁLTALÁNOS SZERZŐDÉSI FELTÉTELEI INTERNET HOZZÁFÉRÉSI SZOLGÁLTATÁS IGÉNYBEVÉTELÉHEZ

Web programoz as

MVC Java EE Java EE Kliensek JavaBeanek Java EE komponensek Web-alkalmazások Fejlesztői környezet. Java Web technológiák

Hálózati használati útmutató

OEP Betegéletút lekérdezés háziorvosok és vénytörténet lekérdezés patikák számára. API dokumentáció. verzió: 2.01

Általános Szerződési Feltételek kivonata

HÁLÓZATI HASZNÁLATI ÚTMUTATÓ

Ingrid Signo Felhasználói kézikönyv. Pénztári használatra

II. év. Adatbázisok és számítógépek programozása

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Tűzfalak működése és összehasonlításuk

Számítógépes Hálózatok GY 4.hét

API tervezése mobil környezetbe. gyakorlat

Csak felvételi vizsga: csak záróvizsga: közös vizsga: Mérnökinformatikus szak BME Villamosmérnöki és Informatikai Kar május 27.

Csatlakozás az IBM i rendszerhez IBM i Access for Windows: Telepítés és beállítás

PHP. Adatbázisok gyakorlat

Hálózatkezelés: Távoli elérés szolgáltatások - PPP kapcsolatok

Felhasználói kézikönyv

Biztonság java web alkalmazásokban

Bevitel-Kivitel. Eddig a számítógép agyáról volt szó. Szükség van eszközökre. Processzusok, memória, stb

Flash és PHP kommunikáció. Web Konferencia 2007 Ferencz Tamás Jasmin Media Group Kft

GroupWise 5.2 használói jegyzet

SIP. Jelzés a telefóniában. Session Initiation Protocol

CAD-CAM

Felhasználói útmutató

Programozás alapjai 1. (BMEVIEEA100)

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Statisztikai alap (2009) - main

Objektumorientált programozás C# nyelven

ÁLTALÁNOS SZERZŐDÉSI FELTÉTELEK

Hálózatkezelés Szolgáltatási minőség (QoS)

A magyar URN:NBN rendszer alapelvei

Számítógépes Hálózatok. 5. gyakorlat

ORACLE. SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Tartalom Az elsõ lépések Alapvetõ mûveletek

Az Oracle rendszer komponensei

TERC V.I.P. Összevont Épít ipari Költségvetés-készít Programrendszer

Mérési útmutató a Secure Shell (SSH) controll és audit című méréshez

Pénzügyi algoritmusok

LEVELEZÉS BEÁLLÍTÁSA

Teleoperáció Robot vezérlése IP-hálózaton

Átírás:

Számítógép labor V. Egyszer Web szerver Dokumentáció (K4C03M) 2003.04.29

Egyszer Web szerver Feladat: Egyszer Web szerver Feladat sorszám: 17 Leírás: Készítsen egy egyszer Web szervert, amely képes statikus html oldalakat kiszolgálni. A szerver egy konfigurálhatóan megadható könyvtárban elhelyezett html formátumú oldalakat legyen képes egy adott porton keresztül kiszolgálni. A szerver használata A szerver futtatása szokványos UNIX-os környezetben:./commanche Ezután a szerver démonként fut tovább a háttérben, így a kommunikációja a külvilággal egy opcionálisan megadott konfigurációs állományon keresztül zajlik. A szerver els lépésként feldolgozza a saját könyvtárában lev commanche.cf konfigurációs állományt. Ha feldolgozás során hibába ütközik, akkor a saját vagy alapértelmezett értékeit használja, vagy kilép. A commanche.cf állományban beállítható paraméterek: Server <sztring> Használat: A <sztring> lesz a szerver azonosító sztringje. Alapérték: "Commanche v.0.01" MaxPendingConnections <portszám> Használat: Megadható vele a még el nem fogadott várakozási sorban lev kérelmek maximális száma. Alapérték: 10 MaxAliveConnections <szám> Használat: Megadható vele az egyidej kapcsolatok maximális száma, vagyis a szálak száma. Alapérték: 20 HTMLRootDirectory "<sztring>" Használat: A HTML illetve egyéb objektumok, melyek a klienssel a szerver által elérhet ek. Alapérték:./htdocs Port <szám> Használat: A szerver kommunikációs portját adja meg. Érdemes 1024-nél nagyobb de 60000-nél kisebb (Solaris alatt). Alapérték: 5555 LogFile "<sztring>" Használat: A log állomány elérési útja és neve adható meg. Ide kerül minden a 2

m ködéssel kapcsolatos (hiba)üzenet. Alapérték:./commanche.log Hibakezelés A szerver a GET és HEAD http protokoll parancsokat valósítja meg. A hibaüzenetek egy része lehet a szabványban rögzített hibajelenség, vagy valamilyen súlyosabb rendszerhiba (nincs elég memória, nem található a m ködéshez szükséges állomány). A rendszerszint hibákat az error() függvény kezeli le, aminek paraméter értékéül még megadható a programból való kilépés is. Protokoll hibajelenségek: 400 Bad Request Ha a nem értelmezhet a küldött parancs. 403 Forbidden Az állomány létezik, de a hozzáférés nem engedélyezett. 404 Not Found A kért objektum nem létezik. 501 Not Implemented A parancs nincs még implementálva. Rendszerszint hibák: #define ERR_THREAD 0x01 A szálat nem sikerült létrehozni. #define ERR_NOMEM 0x02 Nincs elég memória. #define ERR_SEND 0x03 #define ERR_DETACHED_MODE 0x04 Nem sikerült adatot küldeni a socketen keresztül. A szálat nem sikerült DETACHED módban futtatni. #define ERR_MAXLIMIT 0x05 Nem hozható létre több szál. #define ERR_LOG_FILE 0x06 #define ERR_CF_FILE 0x07 Nem sikerült a log file létrehozása. Nem sikerült a konfigurációs file feldolgozása, vagy megnyitása A protokoll ismertetése A http 1.0 verziójának GET és HEAD parancsa lett megvalósítva. Más parancsok fogadásakor Bad request vagy Not Implemented hibákat küld a szerver a kliensnek. GET parancs: A GET parancs különböz objektumok letöltésére szolgáló parancs. Két fajtája lehetséges. Az egyszer GET parancs csak egy sorból áll, amire válaszul azonnal küldhet a kért entitás. Teljes GET parancs esetén a GET után a kért 3

entitás URL-je, majd azt követ en a protokoll verziószáma kerül definiálásra. A többi sor definiálása opcionális. A GET kérést 2 darab újsor jel zárja. A szerver ezután válaszol kötött formátumú státuszjelentéssel a kért entitásról, majd küldi az entitást ha ez küldhet. A http válasz formátuma: "HTTP/1.0 %d %s\r\n"// "Server: Commanche v.0.01\r\n"// "Content-Type: %s\r\n\r\n" ahol a %d jelenti a visszaadott státuszkódot (ha kérés kiszolgálható akkor ennek értéke 200), az els %s az üzenetet (ha nincs hiba akkor OK! az értéke). Végül utolsó paraméterként adható meg az entitás típusa, ami lehet text, html, gif, jpeg. HEAD parancs: A HEAD protokoll parancs nagyon hasonló a GET-hez. A különbség annyi, hogy a HEAD csak a fent részletezett http választ küldi, magát az entitást semmilyen esetben sem küldi el. Így csak a kért entitás típusáról, elérhet ségér l szerezhetünk információt. A szerver felépítése és m ködése Felépítés: A szervert két állomány alkotja: main.c Ez tartalmazza a szerver összes függvényeit, maga az implementáció. Itt vannak a függvények prototípusaik is. commanche.h Csak a szerverre jellemz típusdefiniálások, makrók. Valamint a fordításhoz szükséges Makefile. A fordítás a make parancs kiadásával lehetséges, ami el állít egy commanche nev végrehajtható állományt. Maga a szerver szálak létrehozásával m ködik. Ez azt jelenti, hogy minden kérés kiszolgálásához egy külön szálat indít. Ha kérést az adott szál kiszolgálta, akkor megsz nik. A f program nem várja meg a szál befejez dését, vagyis nincs szinkronizáció a szálak között (DETACHED módban futnak). A szálak alkalmazásával a szerver gyorsabb, er forrás takarékosabb, hatékonyabb, mivel az operációs rendszer magja a szálak közötti kontextus váltás során kevesebb adatot mozgat, hiszen az adatszerkezetek közösek. M ködés: A program elején a szerver egy fork hívással éri el, hogy démonként fusson tovább. Még a program elején a SIGPIPE blokkolásra került, hogy rossz kommunikáció esetén a szerver ne lépjen ki indokolatlanul. Ezekután a server_main függvény elindítja a szervert. Ezután értelmezzük a konfigurációs file-t a parse_cf_file függvény segítségével. Ez feltölti a struct config_t típusú cf struktúrát a megfelel szerverbeállításokkal. Ezekután kerül sor a log állomány 4

megnyitására, és standard kimenet és hibakimenet átirányítására a log file-ba. Lefoglaljuk a memóriát a szálak és azok adatszerkezeteinek számára. Szálak adatszerkezete: struct thread_param_t { // Kapcsolat file-leirója int fd; // Kapcsolat azonosítója (indexe) int idx; // Kliens címe int addrlen; // Állapot (FREE->nem megy a szál) volatile uchar state; // Ez a közösen használt változó melyet mindegyik szál írhat is int volatile *next_free_idx; pthread_mutex_t *free_idx_lock; }; // Kliens cime struct sockaddr_in remoteaddr; // HTTP root könyvtár char ht_root[ht_root_size]; // Log file deszkriptor int log_fd; A szálak szinkronizálása: Miután egy kapcsolódási kérelem accept-el elfogadásra került, a szerver létrehoz egy szálat a pthread_create utasítással a kérés kiszolgálására. Az aktív szálak aktivitásukat a saját adatstruktúrájukban a state változóval jelzik (lehet RESERVED vagy FREE értelemszer en). Ha egy szál lefutott, akkor a next_free_idx változót beállítja a saját idx változójára. Ezzel jelzi, hogy már szabad, valamint beállítja az állapotát FREE-re. Így a f szál mindig a next_free_idx változóval jelzett helyre hoz létre új szálat. Ha létrehozott egy szálat, akkor lineáris kereséssel megkeresi a következ szabad bejegyzést. Így ha már nincs szabad bejegyzés, akkor ez így kimutatható. Mivel a next_free_idx egy közösen írt és olvasott változó a szálak által, így ennek írását egy mutex (bináris szemafor) segítségével végezzük. Ezt jelzi a free_idx_lock pointer. Az írása ennek a változónak a set_free_idx függvénnyel lehetséges. Így a kölcsönös kizárás erre a változóra biztosított. Az idx a conns_data (szálak adatszerkezeteinek tömbje) és a thread_serving (szálak tömbje) tömbök indexét jelenti, úgy ahogy a next_free_idx is. A f szál m ködése: A f szál feladata az el redefiniált porton egy kommunikációs socket létrehozása, és a kapcsolódási kérelmek figyelése ezen a socketen, valamint ezen kérelmek kiszolgálására egy szál elindítása. A listener socket létrehozása a socket függvénnyel történik. Ezután a setsockopt függvénnyel beállítjuk a socket opcióit (socket azonnali elengedése kilépés után). Majd beállítjuk egy struct sockaddr_in struktúrában a szerverünk címét, a kívánt IP protokollt, portot. 5

Ezekután a rendszercímet hozzárendeljük a sockethez a bind függvény segítségével. A listen hívással engedélyezzük a socketet, és a függ kapcsolatok maximális számát beállítjuk. Ezután egy végtelen ciklusban várakozunk új kapcsolat felépítésére az accept hívással. Mivel az accept blokkolva van amíg nincs kapcsolódási kérelem, így CPU polling nem lép fel. Az accept visszaadja az újonnan felépített kapcsolat file-leíróját (socket), amelyet átadva egy szintén ekkor létrhozott szálnak, a kliens kérelmét az új szál lekezeli, majd megsz nik. A szál létrehozása el tt feltöltjük a létrehozandó szál adatstruktúráját, majd megkeressük a következö szál szabad indexét. A kérést kezel szálak m ködése: A kérést kezel szálak feladata a paraméterként átadott socketen keresztül az érvényes http kérések kiszolgálása, hibaüzenetek küldése, majd kilépés. A thread_serve függvény jelenti magát a szálat. Kezdetben lefoglaljuk a bejöv adatoknak a buffert (in_buf), majd várjuk a recv rendszerhívás segítségével a bejöv adatokat. Ez http protokoll révén egy kérés lesz (GET vagy HEAD), melyet a get_params függvény segítségével bontunk fel parancs nevére (comm_name), argumentumaira (URL, comm_args) és a protokoll azonosítójára (protocol_id) ha van ilyen (ebben az esetben beszélünk teljes http kérésr l). Ha felbontás nem sikerült, akkor hibát küldünk, majd az er források elengedése után kilépünk. Ezekután feltöltjük a struct command_t típusú params struktúrát, amely felépítése a következ : struct command_t { // Egyszer vagy teljes HTTP kérésr l van-e szó (SIMPLE,FULL) method_t method; // GET vagy HEAD vagy UNSUPPORTED procedure_t procedure; }; // Kliens socket int client_sck; // Kért URL char rel_path[comm_args_size]; // HTTP Root könyvtár char ht_root[ht_root_size]; A process_command eljárás feldolgozza a küldött parancsot, és hibakódot ad vissza a m velet sikerességér l. Ez lehet GET_NOFILE: Nem találta meg a kért entitást. GET_NOMEM: Nincs elég memória. GET_ERR_SEND: Hiba történt az entitás küldése során. GET_ERR_UNSUPPORTED: Érvénytelen parancs. OK: Az entitás sikeresen el lett küldve. A kliens kiszolgálása után a kapcsolatot bontjuk, a szálat felszabadítjuk, és beállítjuk a következ szabad szál indexét az éppen megsz n szál indexére. A process_command feldolgozza az aktuális parancsot. El ször létrehozza a megfelel elérési útvonalat (a kért URL-t a HTML root könyvtár után f zi). Ezután s megnyitja a kért állományt. Ha ez nem sikerül, akkor vagy egy Forbidden vagy 6

Egyszer Web Szerver Dokumentáció Not Found http választ küld a kliensnek, és visszatér a hívó eljáráshoz. Ha a kérés teljes, akkor egy http válasz formájában tájékoztatunk a sikerességér l, és elküldjük az entitás típusát is. Ezt a get_filetype eljárás végzi, mely az adott URLb l megállapítja a file kiterjesztése alapján, hogy milyen típusú állományról van szó. A következö lépésben ha GET parancsról van szó akkor elküldjük a kért entitás tartalmát, ha HEAD-r l van szó akkor végeztünk. Biztonság: A fejlesztés során próbáltam figyelni arra, hogy a körülményekhez képest biztonságos legyen a szerver. Így például minden buffer-túlcsordulási lehet séget próbáltam kizárni. Az strcpy helyett strncpy-t használtam (ahol ez indokolt volt), valamint a pointer m veleteknél is próbáltam a túlcímzés lehet ségét elkerülni. Így most akármilyen hosszú címet megadva nem okozható buffer-túlcsordulás. URL formátuma: A szerver a szabványban rögzített URL-eket kezeli, így lekezeli a '+' és %<kód> karaktereket is. Ha URL-ként csak egy '/' jelet adunk meg, akkor ezt automatikusan az /index.html -re alakítja, és azzal dolgozik tovább. Függvények: Függvények és struktúrák listája int server_main(); Név void* thread_serve(void *); void error(uchar,uchar); int process_command(struct command_t*); void get_filetype(char *, char*); void log_event(int,const struct thread_param_t*,const char*); void send_http_resp(int,int,char *); void set_free_idx(struct thread_param_t*,int); int parse_cf_file(struct config_t*); int get_params(const char*,char*,char*,char*); Leírás Maga a szerver. Ez csak fork hívás miatt került bele, áttekinthet séget növeli. A kéréseket kiszolgáló szálak függvénye. Hibakiírást és opcionálisan (2. paraméter) kilépést valósít meg. A kért HTTP parancsot hajtja végre. A kérés paramétereit a struct command_t tartalmazza. Az állomány típusát állapítja meg. Log-bejegyzést generál és ír a logállományba. HTTP válasz küldése, protokollban rögzített. Csak teljes kérés esetén küldünk. A szabad index (next_free_idx) beállítása, kölcsönös kizárással. Konfigurációs állomány feldolgozása, alapértékek beállítása (struct config_t feltöltése) Paraméterek kinyerése a küldött HTTP parancsból. Felbontja parancsnévre, URLre, protokoll azonosítóra. 7

Egyszer Web Szerver Dokumentáció Struktúrák: Név struct thread_param_t struct command_t struct config_t Leírás A szálak adatstruktúráját írják le, amit a a f száltól kapnak. Benne van a kliens címe, indexek, kliens socket leíró, szemafor, log file leíró, HTML root könyvtár. A HTTP kérés paramétereit tartalmazza (módszer, eljárás, kliens socket leíró, elérési útvonalak). Konfigurációs állomány tartalma struktúrába képezve. Mellékletek Mellékletben szerepelnek a következö állományok: docs/main.c.pdf: A main.c forrásállomány pdf verziója. docs/commanche.h.pdf: A commanche.h forrásállomány pdf verziója. docs/web_server_doc.pdf: Jelen dokumentáció pdf verziója. docs/web_server_doc.rtf: Jelen dokumentáció rtf verziója. src/commanche.c: Forráskód. src/main.c: Forráskód. src/makefile: Makefile a fordításhoz. src/htdocs.all/: Minta HTML root könyvtár. src/commanche.cf: Minta konfigurációs állomány. 8