„Informatika 2 - Socket kezelés labor” változatai közötti eltérés

A VIK Wikiből
Ugrás a navigációhoz Ugrás a kereséshez
a (David14 átnevezte a(z) Informatika 2 - TCP szerver készítése labor lapot a következő névre: Informatika 2 - Socket kezelés labor: 2013 aktualizálás)
a
22. sor: 22. sor:
 
*Adott architektúrán használt ábrázolás: ''hoszt byte-sorrend''
 
*Adott architektúrán használt ábrázolás: ''hoszt byte-sorrend''
  
== Miért szükséges a szerver socketet címhez kötni és miért nem kell a kliens socketet? ==
+
== Milyen függvényekkel tud kommunikálni a kliens és a szerver? ==
 
 
*Szerver: a kliensnek tudni kell, hogy kitől kérjen kiszolgálást <math>\rightarrow</math> '''connect( )-ben KELL''' a cím
 
*Kliens: nem feltétlen érdekel a cím <math>\rightarrow</math> '''az accept( )-ben''' a klienscím paramétere '''lehet NULL'''
 
 
 
== Az accept() függvény meghívásakor mi történik, ha éppen nincs bejövő kapcsolat? ==
 
 
 
Blokkolja a hívó szálat, amíg nem érkezik kapcsolódási kérés. Persze ezt a blokkolást ki lehet kapcsolni, de defaultból blokkol.
 
  
 
== A kommunikációs kapcsolatot hogyan zárhatja le a kliens, illetve a szerver oldal? ==
 
== A kommunikációs kapcsolatot hogyan zárhatja le a kliens, illetve a szerver oldal? ==
36. sor: 29. sor:
 
*Linux alatt: ''int close(int s)''
 
*Linux alatt: ''int close(int s)''
  
== C-kód: Az s leíróval reprezentált kliens socketből képes 16 byte adat fogadására! ==
+
== Írjon egy „hello világ” programot! ==
  
<pre>
+
== C-kód: Lementi egy állományba a „hello” szöveget! ==
int x;
 
char *buffer;
 
buffer=(char *)malloc(sizeof(char)*16);  /* 16 byte hely lefoglalása */
 
  
x=recv(s, (void *)buffer, sizeof(buffer), 0);
+
== C-kód: Az s leíróval reprezentált kliens kliens socket-en keresztül elküldi a „hello” szöveget! ==
if (x<0) printf("olvasási hiba\n");
 
if (x==0) printf("olvasás sikeres, a kapcsolat lezárult\n");
 
if (x>0) printf("olvasás sikeres\n");
 
 
free(buffer);
 
</pre>
 
  
== C-kód: Az s leíróval reprezentált kliens socketen keresztül elküldi a „hello” stringet! ==
+
int x;
 +
char message[]="hello";
 +
 +
x=send(s, (const void *)message, sizeof(message), 0);
 +
if (x<0) printf("írási hiba\n");
 +
else printf("%d byte elküldve\n", x);
  
<pre>
+
== C-kód: Az s leíróval reprezentált kliens socketből képes 64 byte adat fogadására! ==
int x;
 
char message[]="hello";
 
  
x=send(s, (const void *)message, sizeof(message), 0);
+
int x;
if (x<0) printf("írási hiba\n");
+
char *buffer;
else printf("%d byte elküldve\n", x);
+
buffer=(char *)malloc(sizeof(char)*64);  /* 16 byte hely lefoglalása */
</pre>
+
 +
x=recv(s, (void *)buffer, sizeof(buffer), 0);
 +
if (x<0) printf("olvasási hiba\n");
 +
if (x==0) printf("olvasás sikeres, a kapcsolat lezárult\n");
 +
if (x>0) printf("olvasás sikeres\n");
 +
 +
free(buffer);
  
 
== C-kód: Megvizsgálja, hogy az str1 és str2 nevű karakter tömbök tartalma megegyezik-e! ==
 
== C-kód: Megvizsgálja, hogy az str1 és str2 nevű karakter tömbök tartalma megegyezik-e! ==
 
 
<pre>
+
int x;
int x;
+
char str1[]="qwerty";
char str1[]="qwerty";
+
char str2[]="spqr";
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");
  
x=strcmp(str1, str2);
+
== C-kód: Megvizsgálja, hogy az str1 nevű karakter tömb tartalmazza-e az str2 nevű karakter tömb értékét! ==
if (x==0) printf("a két string azonos\n");
 
else printf("a két string különbözı\n");
 
</pre>
 
  
== C-kód: Megvizsgálja, hogy az str1 nevű karakter tömb tartalmazza-e az str2 nevű karakter tömb értékét! ==
+
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 cím alapján megállapítja a szerve IP-címét (DNS fordítás is!)
 +
#*TCP/IP-kapcsolatot hoz létre a szerver felé
 +
#*HTTP-kéréseket küld a szerver felé
 +
#Szerver:
 +
#*HTTP-válaszokat küld a kliens kéréseire (nincs hiba: lekért oldalt tartalmazza)
 +
#*Bizonyos kérésekre egy adatbázisban módosíthat
 +
#*A válasz végén lebontja a kapcsolatot
 +
 
 +
== A HTTP protokollban a kliens hogyan jelzi a kérés fejlécének végét? ==
 +
 
 +
Két <CR><LF> sorozattal (0x0D 0x0A 0x0D 0x0A byteok).
 +
 
 +
== A HTTP GET kérés hogyan közli a lekérendő dokumentum nevét és elérhetőségét? ==
  
<pre>
+
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).
char str1[]="qwerty";
 
char str2[]="spqr";
 
char *temp;
 
  
temp=strstr(str1, str2);
+
== A web szerver hogyan jelzi, ha hiba történt a dokumentum lekérése során? ==
if (temp!=NULL) printf("az elsı string tartalmazza a másodikat\n");
 
else printf("az elsı string nem tartalmazza a másodikat\n");
 
</pre>
 
  
== C-kód: Megvizsgálja, hogy az str1 nevű karakter tömb tartalmazza-e a ch nevű karaktert! ==
+
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).
  
<pre>
+
A (HTTP 1.1-es) válaszkódok bővebben megtalálhatóak itt: http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html
char str1[]="qwerty";
 
char ch='z';
 
char *temp;
 
  
temp=strchr(str1, ch);
+
== Mi az a két mód, ahogy a web szerver jelezheti a dokumentum méretét (végét)? ==
if (temp!=NULL) printf("az elsı string tartalmazza a karaktert\n");
 
else printf("az elsı string nem tartalmazza a karaktert\n");
 
</pre>
 
  
 +
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.
  
 
[[Category:Villanyalap]]
 
[[Category:Villanyalap]]

A lap 2013. február 11., 20:20-kori változata

Ez az oldal az Informatika 2 című tárgy - TCP szerver készítése labor beugrókérdéseinek kidolgozását tartalmazza.

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
  • Kommunikációra NEM alkalmas, csak kapcsolatok fogadására

Kliens:

  • A szerver címére kapcsolódási kérést küld, amelyre az reagálhat
  • Kommunikációra használjuk

A cím összeállításánál miért szükséges a számokat konvertálni?

  • Több byte-os adattípusokat használunk, de különböző architektúra [math]\rightarrow[/math] különböző adatábrázolás (x86=little endian=kisebb helyiértékű byte-al kezd, Sun=big endian)
  • DE: ezeknek meg kell érteni egymást [math]\rightarrow[/math] közös ábrázolás, hálózati byte-sorrend (big endian)
  • Adott architektúrán használt ábrázolás: hoszt byte-sorrend

Milyen függvényekkel tud kommunikálni a kliens és a szerver?

A kommunikációs kapcsolatot hogyan zárhatja le a kliens, illetve a szerver oldal?

  • int closesocket(SOCKET s) rendszerhívás
  • Linux alatt: int close(int s)

Írjon egy „hello világ” programot!

C-kód: Lementi egy állományba a „hello” szöveget!

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";

x=send(s, (const void *)message, sizeof(message), 0);
if (x<0) printf("írási hiba\n");
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;
buffer=(char *)malloc(sizeof(char)*64);  /* 16 byte hely lefoglalása */

x=recv(s, (void *)buffer, sizeof(buffer), 0);
if (x<0) printf("olvasási hiba\n");
if (x==0) printf("olvasás sikeres, a kapcsolat lezárult\n");
if (x>0) printf("olvasás sikeres\n");
	
free(buffer);

C-kód: Megvizsgálja, hogy az str1 és str2 nevű karakter tömbök tartalma megegyezik-e!

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 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?

  1. Kliens (böngésző):
    • A beírt cím alapján megállapítja a szerve IP-címét (DNS fordítás is!)
    • TCP/IP-kapcsolatot hoz létre a szerver felé
    • HTTP-kéréseket küld a szerver felé
  2. Szerver:
    • HTTP-válaszokat küld a kliens kéréseire (nincs hiba: lekért oldalt tartalmazza)
    • Bizonyos kérésekre egy adatbázisban módosíthat
    • A válasz végén lebontja a kapcsolatot

A HTTP protokollban a kliens hogyan jelzi a kérés fejlécének végét?

Két <CR><LF> sorozattal (0x0D 0x0A 0x0D 0x0A byteok).

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.