next up previous contents
Next: A socketokhoz kapcsolódó Up: A socketokkal kapcsolatos Previous: A socketokkal kapcsolatos

TCP sürgos adat továbbítása

Mint már említve volt, a TCP lehetoséget ad sürgos adatok (TCP urgent data) küldésére is. A socket interface "generikus" ilyen irányú megtervezése (vagyis az Out of Band data kezelése) nagyon nehéz volt, mivel az egyes protokollok más-más dolgokat engednek meg Out of Band data-nak. A TCP protokoll egyszerre akár több, és akármilyen hosszú üzenetet tud továbbítani, míg mondjuk az XNS hálózat egy idoben legfeljebb 1 bytenyi sürgos adatot (Out of Band data-t) tud kezelni (ha csak ezt az XNS lehetoséget használjuk ki a programunkban, akkor könnyen átviheto lesz TCP-re, míg fordítva ez nem szokott menni). Még az is bonyolítja a helyzetet, hogy a TCP már azelott jelezni képes a kommunikációs partnernek a sürgos adat létezését, még mielott maguknak az adatoknak az átvitele megtörténne.

A sürgos (OOB) adatok elküldése és fogadása annyiból áll, hogy a send() ill. recv() rendszerhívásoknál megadjuk az MSG_OOB konstans flaget. Az OOB adatokat a többi "normál" adattól teljesen függetlenül lehet beolvasni (mintha egy külön kommunikációs csatornán kapnánk oket), és az

     ioctl(sock, SIOCATMARK, &answer);

ioctl() rendszerhívással kérdezhetjük meg az operációs rendszertol, hogy a "normál" adatfolyamnak ezen a pontján küldték-e az OOB adatot (eszerint a feltétel szerint lesz az answer==1 állítás igaz vagy hamis, azaz az answer változó értéke 1 lesz, ha az adatfolyamnak ezen a pontján küldték az OOB adatot). Lásd erre a következo példát!

sigurg_signal_handler()
{
  int atmark, buf[1024];

  while(1) {
    if (ioctl(sock, SIOCATMARK, &atmark)<0) {
      perror("ioctl");
      exit(2);
      }
    if (atmark) break;
    read(sock, buf,1024);
  }
  if (recv(sock, &atmark, 1, MSG_OOB) <0) {
    perror("recv");
    exit(1);
    }
  }
}

A fenti programrész a SIGURG signal (a SIGURG signal azt jelzi, hogy sürgos adatot küldött a kommunikációs partner, de nem biztos, hogy azt már meg is kaptuk ...) kezelését végzi. Beolvassa (és "eldobja") a normál adatokat egész addig, amíg a sürgos adat elküldési helyéig el nem jut, és ott beolvas 1 bytenyi sürgos adatot. (A SIGURG signalról ld. a következo pontot.)



Csizmazia Balazs
Tue Apr 2 00:06:27 MET DST 1996