Теория и практика программирования на Си в Unix


Примеры - часть 2


сокетов (см. параграф 4.3.5.) с заменой reads() и writes() на readt() и writet(), определенные в файле tli.c */ ...................... }

/* файл serveur.c #include "tli.h"

serveuripc() { int fd; /* дескриптор TLI int nfd; /* дескриптор TLI struct t_call *callptr; /* структура TLI struct t_bind *reg; /* структура TLI struct sockaddr_in serv_addr; /* адрес сервера

/* создание точки входа в транспортный уровень */ fd = t_open("/dev/tcp", O_RDWR, NULL); /* присваивание значения адресу и связывание bzero(&serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(SERV_PORT); req = (struct t_bind *) t_alloc(fd, T_BIND, T_ALL); req->addr.len = sizeof(serv_addr); req->addr.maxlen = sizeof(serv_addr); req->addr.buf = (char *) &serv_addr; req->qlen = 1; t_bind(fd, req, NULL);

/* распределение структуры t_call, используемой функциями t_listen() и t_accept() */ callptr = (struct t_call *) t_alloc(fd, T_CALL, T_ADDR); /* бесконечный цикл ожидания привходящих связей for (;;) { t_listen(fd, callptr); /* получение новой точки входа в транспортный уровень, используемой для обмена */ nfd = accept_call(fd, callptr); /* обращение к службе "эхо" serveur(nfd); /* закрытие используемой точки входа t_close(nfd); } }

/* прием запроса на связь. Возвращает новую точку входа или - 1 в случае ошибки */ int accept_call(lfd, callptr) int lfd ; /* дескриптор TLI struct t_call *callptr; /* структура TLI { int nfd ; /* дескриптор TLI /* открытие новой точки входа в транспортный уровень nfd = t_open("/dev/tcp", O_RDWR, NULL); /* ей присваивается какой-нибудь адрес t_bind(nfd, NULL, NULL); /* связывание старой и новой точек входа */ /* в нашем примере (итеративный сервер) можно было бы сохранить текущий дескриптор lfd для обмена данными с клиентом */ if (t_accept(lfd, nfd, callptr) < 0) { if (t_errno == TLOOK) { /* если ошибка : связь разорвана ? */ t_rcvdis(lfd, NULL); /* тогда закрываем точку входа */ t_close(nfd); return(-1); } err_sys(" t_accept echoue"); } return(nfd); }




- Начало -  - Назад -  - Вперед -



Книжный магазин