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.