Два последних аргумента описываются структурой t_bind
struct netbuf addr | Адрес |
unsigned qlen | Максимальное число запросов на установление связи, которые могут ожидать обработки. Имеет смысл только для протоколов с предварительным установлением соединения |
Рассмотрим три возможных формата аргумента req
req == NULL | Позволяет поставщику транспортных услуг самому выбрать подходящий адрес |
req != NULL req-addr.len == 0 | Позволяет поставщику транспортных услуг самому брать подходящий адрес, но определяет максимальное число запросов на установление связи, которые могут ожидать обработки |
req != NULL req-addr.len 0 | Явно указывает требуемый адрес и максимальное число запросов на установление связи, которые могут ожидать обработки |
Во всех случаях фактическое значение адреса возвращается в структуре ret
ret
.Для протоколов с предварительным установлением соединения программе-клиенту необходимо использовать функцию
#include tiuser.h
int t_connect(int fd, const struct t_call* sndcall,
struct t_call *rcvcall);
Аргумент sndcall
t_call
, имеющей следующие поля:struct netbuf addr | Адрес удаленного транспортного узла |
struct netbuf opt | Требуемые опции протокола |
struct netbuf udata | Прикладные данные, отправляемые вместе с управляющей информацией (запрос на установление соединения или подтверждение) |
int sequence | В данном случае не имеет смысла |
Через аргумент revcall
rcvcall
равным NULL
, если информация о канале ее не интересует.Обычно возврат из функции
Для протоколов с предварительным установлением соединения программа-сервер вызывает функцию
#include tiuser.h
int t_listen(int fd, struct t_call *call);
Информация, возвращаемая транспортным протоколом в аргументе call
sequence
аргумента call
содержит уникальный идентификатор данного запроса.Хотя
#include tiuser.h
int t_accept(int fd, int connfd, struct t_call *call);
Аргумент fd
connfd
адресует транспортный узел, для которого будет установлено соединение с удаленным узлом. За создание нового транспортного узла отвечает сама программа (т.е. необходим явный вызов функции fd
может по-прежнему использоваться для обслуживания поступающих запросов.Как и в случае
call
передается информация об удаленном транспортном узле.