Два последних аргумента описываются структурой 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
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
программе возвращается информация о виртуальном канале после его создания: адрес удаленного узла, опции и прикладные данные, переданные удаленным узлом. Как уже отмечалось, ни TCP, ни UDP не позволяют передавать данные вместе с управляющей информацией. Программа может установить значение rcvcall
равным NULL
, если информация о канале ее не интересует.
Обычно возврат из функции
Для протоколов с предварительным установлением соединения программа-сервер вызывает функцию
#include
int t_listen(int fd, struct t_call *call);
Информация, возвращаемая транспортным протоколом в аргументе call
, содержит параметры, переданные удаленным узлом с помощью соответствующего вызова sequence
аргумента call
содержит уникальный идентификатор данного запроса.
Хотя
#include
int t_accept(int fd, int connfd, struct t_call *call);
Аргумент fd
адресует транспортный узел, принявший запрос (тот же, что и для функции connfd
адресует транспортный узел, для которого будет установлено соединение с удаленным узлом. За создание нового транспортного узла отвечает сама программа (т.е. необходим явный вызов функции fd
может по-прежнему использоваться для обслуживания поступающих запросов.
Как и в случае call
передается информация об удаленном транспортном узле.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии