После возврата из функции connfd
и удаленным узлом-клиентом) образован виртуальный канал, готовый к передаче прикладных данных.
Для обмена прикладными данными после установления соединения используются две функции:
#include
int t_rcv(int fildes, char *buf, unsigned nbytes, int* flags);
int t_snd(int fildes, char *buf, unsigned nbytes, int flags);
Первые три аргумента соответствуют аналогичным аргументам системных вызовов flags
функции
T_EXPEDITED | Указывает на отправление экстренных данных |
T_MORE | Указывает, что данные составляют логическую запись, продолжение которой будет передано последующими вызовами |
Эту информацию принимающий узел получает с помощью flags
.
Для протоколов без предварительного установления соединения используются функции
#include
int t_rcvudata(int fildes, struct t_unitdata *unitdata,
int* flags);
int t_sndudata(int fildes, struct t_unitdata *unitdata);
Для передачи данных используется структура unitdata
, имеющая следующие поля:
struct netbuf addr | Адрес удаленного транспортного узла |
struct netbuf opt | Опции протокола |
struct netbuf udata | Прикладные данные |
Созданный транспортный узел может быть закрыт с помощью функции
#include
int t_close(int fd);
где fd
определяет транспортный узел. Вызов этой функции приведет к освобождению ресурсов, связанных с транспортным узлом, а последующий системный вызов
Завершая разговор о программном интерфейсе TLI, необходимо упомянуть об обработке ошибок. Для большинства функций TLI свидетельством ошибки является получение -1 в качестве возвращаемого значения. Напротив, в случае нормального завершения эти функции возвращают 0. Как правило, при неудачном завершении функции TLI код ошибки сохраняется в переменной t_errno
, подобно тому, как переменная errno
хранит код ошибки системного вызова. Для вывода сообщения, расшифровывающего причину ошибки, используется функция
#include
void t_error(const char *errmsg);
При вызове errmsg
, определенное разработчиком программы, за которым последует расшифровка ошибки, связанной с кодом t_errno
. Если значение t_errno
равно TSYSERR
, то расшифровка представляет собой стандартное сообщение о системной ошибке, связанной с переменной errno
.
В заключение в качестве иллюстрации программного интерфейса TLI приведем пример приложения клиент-сервер. Как и в предыдущих примерах, сервер принимает сообщения от клиента и отправляет их обратно. Клиент, в свою очередь, выводит полученное сообщение на экран. В качестве сообщения, как и прежде, выступает жизнерадостное приветствие "Здравствуй, мир!".
#include
#include
#include
#include
#include
#include
#include
#include
/* Номер порта, известный клиентам */
#define PORTNUM 1500
main(argc, argv)
int argc;
char *argv[];
{
/* Дескрипторы транспортных узлов сервера */
int tn, ntn;
int pid, flags;
int nport;
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии