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.