„Informatika 2 - Socket kezelés labor” változatai közötti eltérés
| 121. sor: | 121. sor: | ||
== A HTTP protokollban a kliens hogyan jelzi a kérés fejlécének végét? == | == A HTTP protokollban a kliens hogyan jelzi a kérés fejlécének végét? == | ||
Egy <code><CR><LF><CR><LF></code> sorozattal (<code>0x0D 0x0A 0x0D 0x0A</code> bájtok). Ez magyarul két sortörést (entert) jelent (egy sortörés egy CR-LF). | |||
== A HTTP GET kérés hogyan közli a lekérendő dokumentum nevét és elérhetőségét? == | == A HTTP GET kérés hogyan közli a lekérendő dokumentum nevét és elérhetőségét? == | ||
A lap 2013. február 13., 19:43-kori változata
Ez az oldal az Informatika 2 című tárgy - Socket kezelés labor beugrókérdéseinek kidolgozását tartalmazza. Ezek bejelentkezés után megtalálhatóak a tanszéki honlapon a 2. labor segédlet címen (2013 tavasz).
Jelenleg még elég hiányos a kidolgozás, továbbá évről évre kismértékben változhatnak beugrókérdések. A tanszéki honlapról mindig elérhető az aktuális mérési útmutató, mely az aktuális beugrókérdéseket tartalmazza.
Kérlek szerkesszétek, aktualizáljátok!
Mi a különbség a szerver és a kliens socket között?
Szerver:
- Bizonyos címen várja az igényeket, majd befutásuk után felépíti a kapcsolatot
- Csak passzív módon kommunikál, kliens által létrehozott kapcsolaton keresztül
Kliens:
- A szerver címére kapcsolódási kérést küld, amelyre az reagálhat
- Aktív módon kezdeményezi a kommunikációt
A cím összeállításánál miért szükséges a számokat konvertálni?
Több bájtos adatstruktúrák írják le a címek különböző részeit (címrész, portszám), és ezek ábrázolása lehet big endian vagy little endian bájtsorrendű, amikor a magasabb illetve az alacsonyabb helyiértékű bájtok vannak előbb. (Pl. az x86 architektúra little endian, a SUN Sparc.) A hálózati bájtsorrend mindig valamilyen megegyezés szerint szabványos, minden címnek abban a formátumban kell lennie.
Hogy ne kelljen külön kódot írni attól függően, hogy a gépünk éppen milyen architektúrájú, ezért használjuk a koncerziós függvényeket, amik minden számot a gép ("hoszt") bájtsorrendjéről a hálózat bájtsorrendjére alakítanak.
Milyen függvényekkel tud kommunikálni a kliens és a szerver?
Közvetlenül az int send(SOCKET, const void *, size_t, int) és az int recv(SOCKET, void *, size_t, int) függvényekkel tudnak egymásnak adatokat küldeni, de előtte további függvények segítségével kell a socketeket a kapcsolat felépítéséhez inicializálni.
A kommunikációs kapcsolatot hogyan zárhatja le a kliens, illetve a szerver oldal?
Az int closesocket(SOCKET) (vagy linux alatt az int close(SOCKET)) függvény meghívásával.
Írjon egy „hello világ” programot!
#include <stdio.h>
int main(int argc, char** argv) {
printf("Hello World!\n");
return 0;
}
C-kód: Lementi egy állományba a „hello” szöveget!
#include <stdio.h>
int main(int argc, char** argv) {
// INNENTŐL KELL
FILE* fp;
fp = fopen("fajl.txt", "w");
if (!fp) {
perror("fopen()-ben hiba volt")
return -1;
}
fprintf(fp, "hello\r\n");
fclose(fp);
// IDÁIG KELL
return 0;
}
C-kód: Az s leíróval reprezentált kliens kliens socket-en keresztül elküldi a „hello” szöveget!
int x;
char message[] = "hello";
SOCKET s;
// ... itt történne a socket inicializálása
// INNENTŐL A LÉNYEG:
x = send(s, (const void *)message, sizeof(message), 0);
if (x<0) {
perror("hiba a send() fv-ben");
return -1;
}
else {
printf("%d byte elküldve\n", x);
}
C-kód: Az s leíróval reprezentált kliens socketből képes 64 byte adat fogadására!
int x;
char buffer[64];
// ... előtte történik a socket inicailizálása
// A LÉNYEG:
x = recv(s, (void *)buffer, sizeof(buffer), 0);
if (x<0) printf("olvasási hiba\n");
if (x>0) printf("olvasás sikeres\n");
if (x==0) printf("olvasás sikeres, a kapcsolat lezárult\n");
C-kód: Megvizsgálja, hogy az str1 és str2 nevű karaktertömbök tartalma megegyezik-e!
int strcmp(const char*, const char*) függvény dokumentációja
int x;
char str1[]="qwerty";
char str2[]="spqr";
x=strcmp(str1, str2);
if (x==0) printf("a két string azonos\n");
else printf("a két string különbözı\n");
C-kód: Megvizsgálja, hogy az str1 nevű karakter tömb tartalmazza-e az str2 nevű karakter tömb értékét!
char* strstr(char*, const char*) függvény dokumentációja
char str1[]="qwerty";
char str2[]="spqr";
char *temp;
temp=strstr(str1, str2);
if (temp!=NULL) printf("az elsı string tartalmazza a másodikat\n");
else printf("az elsı string nem tartalmazza a másodikat\n");
Egy HTTP kommunikációban milyen felek vesznek részt és mi a feladatuk?
- Kliens (böngésző):
- A beírt internetcím alapján megállapítja a szerver IP-címét (lekérdezi egy DNS-szervertől (link: Wikipédia) egy külön kapcsolaton keresztül)
- TCP/IP-kapcsolatot hoz létre a szerver felé
- HTTP-kéréseket küld a szerver felé
- Szerver:
- Nyilvánosan elérhető socketeken keresztül várja a kliensek kapcsolódási kérelmeit
- HTTP-válaszokat küld a kliens kéréseire (normális esetben például a kért oldalt szolgálja ki, egyéb esetben hibaüzenettel válaszol)
- Kliensek kéréseire egyéb módon is reagálhat a szerveren (előre meghatározott programot lefuttathat, adatbázist módosíthat, stb.)
- A válasz végén lebonthatja a kapcsolatot
A HTTP protokollban a kliens hogyan jelzi a kérés fejlécének végét?
Egy <CR><LF><CR><LF> sorozattal (0x0D 0x0A 0x0D 0x0A bájtok). Ez magyarul két sortörést (entert) jelent (egy sortörés egy CR-LF).
A HTTP GET kérés hogyan közli a lekérendő dokumentum nevét és elérhetőségét?
A küldött parancs (pl. GET) után egy szóközzel elválasztva következik a dokumentum helye a szerver gyökérkönyvtárához képest. Pl. a www.google.com szervernek küldött GET / HTTP/1.0 lekérés magát a gyökérkönyvtárat kéri le (perjel).
A web szerver hogyan jelzi, ha hiba történt a dokumentum lekérése során?
A válasz tartalmaz egy státuszkódot (hibakódot). Ha ennek első számjegye 4-es, az kliensoldali hibát jelent (pl. 404 Not found), ha 5-ös, az szerveroldali hiba (pl. 500 Internal Server Error).
A (HTTP 1.1-es) válaszkódok bővebben megtalálhatóak itt: http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html
Mi az a két mód, ahogy a web szerver jelezheti a dokumentum méretét (végét)?
A fejlécben előre elküldheti a dokumentum méretét (pl. Content-Length fejléc mező), vagy az átvitel befejezése után simán bontja a TCP/IP-kapcsolatot.
