Professional Documents
Culture Documents
Mérési segédlet
Informatika 2
1
A HTTP protokoll későbbi verziói egy kapcsolaton keresztül több állomány átvitelét is lehetővé
teszik, azonban az egyszerűség kedvéért a labor keretein belül csak az 1.0 verzió bővítések nélküli
változatával foglalkozunk.
1
A HTTP protokoll elemei
A HTTP protokollban a kérések általános formája a következő:
parancs URL protokoll-ID<CR><LF>
fejléc<CR><LF>
<CR><LF>
test
A kliensek parancsai
A HTTP 1.0 verzióban a kliens 3 kérés típust küldhet a szervernek.
HEAD
A HEAD parancs arra kéri a szervert, hogy a megnevezett dokumentum fejlécét
küldje vissza. A szerver által visszaküldött fejlécnek minimum tartalmaznia kell a
dokumentum hosszát, az utolsó módosítás dátumát, és a típusát.
Példa:
2
GET
A GET parancs arra kéri a szervert, hogy a megnevezett dokumentumot keresse meg
és küldje vissza. A szerver visszaküldi a HEAD-nél is visszaadott fejlécet, és ezt követi a
dokumentum. A GET parancs arra is használható, hogy információkat küldjön vissza a
szerver számára, azonban erre a feladatra elsősorban a POST parancs szolgál.
Példa:
POST
A POST parancs arra szolgál, hogy adatokat küldjünk vele a klienstől a szervernek.
Leggyakrabban a HTML formok használják ezt a metódust az adatok elküldésére.
Természetesen a kérés a parancson kívül tartalmaz egy fejlécet minimum az adatokat
tartalmazó test hosszával, és a test részben az adatokat.
Példa:
data=5
A szerver válaszai
A szerverek leggyakrabban használt hibakódjait a következő táblázat foglalja össze.
3
Először is nézzünk meg egy egyszerű kommunikációt a kliens és a szerver között!
GET / HTTP/1.0
Kliens
<HTML>
<HEAD>Teszt</HEAD>
<BODY>Teszt</BODY>
</HTML>
A fenti kommunikációban példát láthatunk arra az esetre, amikor a kért URL nem
egy állományt tartalmaz, hanem csak egy könyvtárat. Esetünkben ez a web szerver
főkönyvtára. Ilyen esetekben a web szerver automatikusan az alapértelmezett
dokumentumot (tipikusan index.html) keresi az adott könyvtárban.
<HTML>
<HEAD>404 Not Found</HEAD>
<BODY>A kért oldal nem található a szerveren.</BODY>
</HTML>
telnet szerver.hu 80
4
be kell írnunk egy HTTP protokoll szerinti kérést. Az egyszerűség kedvéért írjuk be a
következő sort és nyomjunk utána két Entert.
GET / HTTP/1.0
Ellenőrző kérdések
1. Egy HTTP kommunikációban milyen felek vesznek részt és mi a feladatuk?
2. A HTTP kommunikáció során hogyan állapodnak meg a felek a használandó
HTTP protokoll verzióban?
3. A HTTP protokollban a kliens hogyan jelzi a kérés fejlécének végét?
4. A HTTP GET kérés hogyan közli a lekérendő dokumentum nevét és
elérhetőségét?
5. A web szerver hogyan jelzi, ha hiba történt a dokumentum lekérése során?
6. A web szerver milyen két módon jelezheti a dokumentum méretét (végét)?
7. Írjon C nyelvű kódrészletet, amely megkeresi az str karakter tömbben tárolt
szöveg második szavát, és az str2 tömbben visszaadja!
8. Írjon C nyelvű kódrészletet, amely megvizsgálja, hogy az str karakter
tömbben tárolt szöveg első szava „GET”-e, és ha igen, akkor a második
szavát az str2 tömbben visszaadja!
9. Írjon C nyelvű kódrészletet, amely egy állományt binárisan megnyit, majd
bezár! Ha a megnyitás sikertelen, akkor jelezze a hibát!
10. Írjon C nyelvű kódrészletet, amely az str karakter tömbben tárolt szöveget
elküldi az s leíróval reprezentált kliens socketen keresztül!
A feladat
A gyakorlat során a hallgató feladata, hogy elkészítsen egy egyszerű, a HTTP 1.0
protokollt megvalósító web szervert C nyelven. Ennek a következőket kell teljesítenie:
• Egy paraméterként megadott TCP porton fogadja a böngészők
kapcsolódásait!
• Egyszerre elegendő, ha csak egy böngészőt szolgál ki.
• Elegendő csak a GET műveletet implementálni.
• A GET parancsban érkező dokumentum megnevezést ki kell olvasni és a
hivatkozott dokumentumot el kell küldeni a válaszcsomagban a kliens felé!
5
A Web szerver implementációjához a TCP szerver programnak a kommunikáció
részét kell módosítania. A klienstől, vagyis a böngészőtől kapott csomagot be kell olvasni
és string kezelő függvényekkel (pl. sscanf()) kinyerni belőle a kérés típusát és a kért
állomány nevét.
http://localhost:1234/proba.html
Ha egy oldalt egyszer már sikeresen letöltött a web böngésző, akkor azt a
gyorsító tárban eltárolja. Így ha az adott oldallal további teszteket kívánunk
végezni, akkor fontos, hogy az oldalt a CTRL és a Refresh (F5) gombok együttes
lenyomásával frissítsük!
6
Függelék A – MS Windows kiinduló program
A korábban létrehozott TCP szerver programkód:
#include <stdio.h>
#include <winsock2.h>
WSADATA wsd;
if(WSAStartup(0x0202, &wsd) != 0)
{
perror("WSAStartup");
return 1;
}
if(argc < 2)
{
printf("Hasznalat: %s port\n", argv[0]);
return 1;
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(atoi(argv[1]));
if(listen(ssock, 5) < 0)
{
perror("listen");
return 1;
}
closesocket(csock);
}
closesocket(ssock);
WSACleanup();
return 0;
}
Függelék B – Linux kiinduló program
A korábban létrehozott TCP szerver programkód:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
if(argc < 2)
{
printf("Hasznalat: %s port\n", argv[0]);
return 1;
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(atoi(argv[1]));
if(listen(ssock, 5) < 0)
{
perror("listen");
return 1;
}
close(csock);
}
close(ssock);
return 0;
}