next up previous contents
Next: Távoli eljáráshívás Up: A Transport Layer Previous: TSAP címének törlése

Egy TLI-t használó példaprogram

Az elozo pontokban láthattuk, hogy a TLI-vel hogyan lehet a hálózati kapcsolatok kialkítását elvégezni. A kapcsolatkialakítás lépéseit konkrétan (programok formájában) a socketoknál részletesen bemutattuk - ez alapján a TLI könyvtárral készített hálózati alkalmazások problémamentesen elkészíthetoek. Itt csak egy rövid példa következik: egy TLI alapú szerver. A szerver vár egy kliensre az 5678-as TCP porton, majd a klienssel egy új TCP porton felveszi a kapcsolatot: adatokat olvas tole, majd a beolvasott adatokat kiírja a szabványos hibacsatornára.

/*
 * Ez a program TRANSPORTDEV altal azonositott 
 * transzportprotokollon "server"-el. (A peldaban az 5678-as szamu
 * TCP porton.)
 * Var egy kapcsolatra, beolvas onnan egy max. 1024 byteos adatbuffert
 * es kiirja a  standard errorra.
 *
 * Forditasa:
 *
 *   cc xtis.c -o xtis -lnsl_s
 */

#include <sys/types.h>
#include <tiuser.h>
#include <stdio.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <sys/socket.h>

#define TRANSPORTDEV "/dev/tcp"
#define BUFFSIZE 1024

extern int t_errno;

main()
{
  struct t_info ti;
  int tfd,newtfd;
  struct sockaddr_in server_addr;
  struct t_call *call;
  struct t_bind *bind;
  int rcvflags;
  char buff[BUFFSIZE+1];
  int ret;
  
  tfd=t_open(TRANSPORTDEV,O_RDWR,&ti);
  if (tfd == (-1)) {
    t_error("Hiba a t_open()-nel!");
    exit(1); }
  if ((bind=(struct t_bind *)t_alloc(tfd,T_BIND,T_ADDR)) == NULL) {
    t_error("Hiba a t_alloc()-nal");
    exit(1); }
  bind->qlen=5;
  bind->addr.len=sizeof(struct sockaddr_in);
  bind->addr.buf= (char *)&server_addr;
  bind->addr.maxlen=sizeof(struct sockaddr_in);
  ((struct sockaddr_in *)bind->addr.buf)->sin_family=AF_INET;
  ((struct sockaddr_in *)bind->addr.buf)->sin_port=htons(5678);
  ((struct sockaddr_in *)bind->addr.buf)->sin_addr.s_addr=
                                                htonl(INADDR_ANY);
  if (t_bind(tfd,bind,bind)<0) {
    t_error("Hiba a t_bind()-nel!");
    exit(1);
  }
  newtfd=t_open(TRANSPORTDEV,O_RDWR,&ti);
  if (newtfd == (-1)) {
    t_error("Hiba a t_open()-nel!");
    t_close(tfd);
    exit(1); }
  if ((call = (struct t_call *)t_alloc(tfd, T_CALL, T_ADDR)) == NULL) {
    t_error("Hiba a t_alloc()-nal!");
    exit(1);
  }
  if (t_listen(tfd, call) < 0) {
    t_error("Hiba a t_listen()-nel!");
    exit(1);
  }
  if (t_accept(tfd, newtfd, call) < 0) {
    t_error("Hiba a t_accept()-nel!");
    if (t_errno == TLOOK) {
      if (t_rcvdis(tfd, NULL) < 0) {
        t_error("Disconnect-et kaptam ...");
        exit(1);
      }
    }
    t_close(newtfd);
    t_close(tfd);
    exit(1);
  }
  ret=t_rcv(newtfd, &buff, BUFFSIZE, &rcvflags);
  buff[ret]='\0';
  fprintf(stderr,"String received: >>%s<<\n",buff);
  t_close(tfd);
  t_close(newtfd);
}

Megjegyzés: a t_error() könyvtári függvény a korábban megismert perror()-hoz hasonlít (mert valamilyen hiba oká emberi módon képes kiírni) és a TLI muveletek után használhatóak.



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