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


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


/* функция приема-передачи serveur(nfd) int nfd; /* дескриптор TLI */ { /* обработка, идентичная обработке для сокетов с заменой reads() и writes() на readt() и writet() */ ....................... /* результатом операции может быть отрицательное значение, если клиент разорвал связь */ if (rval < 0) { /* выход, если получено T_DISCONNECT */ if (t_look(nfd) == T_DISCONNECT) return; err_sys ("pb lecture TLI "); } }

/* файл tli.c *****************************/ /* содержит процедуры, используемые, как клиентом, так и сервером : * writet() : запись в точку входа блоками размером по 4К (как показывает тест (на Sun OS 4.1.) нельзя послать блок данных, размер которого превосходит это значение). * readt() : считывает информацию из точек входа до тех пор, пока не считает требуемое количество символов. * err_sys() : выводит на экран сообщение об ошибке и кончает работу. */ #include <stdio.h> #include <tiuser.h> /* запись буфера, состоящего из пос байт в точку входа */ int writet(fd, pbuf, noc) register int fd; /* дескриптор TLI */ register char *pbuf; /* буфер */ register int noc; /* число записываемых байт */ { /*то же, что и writes(), но write() заменяется на t_snd()*/ ........... }

/* считывание буфера, состоящего из пос байт из точки входа int readt(fd, pbuf, noc) register int fd; /* дескриптор TLI */ register char *pbuf; /* буфер */ register int noc; /* число считываемых байт */ { /* то же, что и reads() (Глава 4), но read() заменяется на t_snd() */ ........... }

/* процедура обработки ошибок */ err_sys(mes) char *mes; /* сообщение пользователя */ { t_error(mes); exit(1); } - Модификация предыдущего примера с использованием примити- вов read () и write () на сервере. На сервере создается модуль Stream tirdwr, позволяющий ис- пользовать вызовы read (), write () и close (). Эта операция осуществляется в процедуре accept_call (), вследствие этого измененной. ПРОГРАММА 41 /* модификация процедуры accept_call(), обеспечивающая возможность использования read(),write() и close() */ /* прием запроса на связь: создание дескриптора файла для этой связи. Возвращает или новый дескриптор или, в случае сбоя, -1. */ accept_call(lfd, callptr) int lfd; /* дескриптор TLI */

struct t_call *callptr; /* структура TLI */ { int nfd; /* дескриптор TLI */ /* начало такое же, как и в предыдущем примере */ ............................. /* выполняется "push" для модуля "tirwdr" для нового потока, чтобы обеспечить использование read() и write(). Надо сначала выполнить "pop" для модуля "timod" /* ioct1(nfd, I_POP, (char *)0);

ioct1(nfd, I_PUSH, "tirdwr"); return(nfd); /* возвращает новый дескриптор */ }




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



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