[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Установка соединения - Пример
Процедуры установки соединения подчеркивают различие между клиентом
и сервером. Транспортный интерфейс навязывает на этой стадии
различные наборы процедур для каждого типа транспортного
пользователя. Клиент инициирует создание соединения запросом
соединения к определенному серверу, вызывая t_connect(3N). Сервер
уведомляется о запросе клиента вызовом t_listen(3N). Сервер может
либо принять, либо отвергнуть запрос клиента. Он вызовет либо
t_accept(3N) для подтверждения соединения, либо t_snddis для отказа
запросу. Клиент будет уведомлен о решении сервера, когда t_connect
завершится.
В программе клиента:
25-28 Вызывается t_alloc для размещения struct t_call с третьим
аргументом T_ADDR, требующим размещения буфера под поле
addr
30-31 Известный адрес сервера назначается соответствующему полю
в структуре t_call.
33-35 t_connect делает запрос на соединение
В программе сервера:
41-43 Размещается структура t_call. Информация о вызывающем
клиенте будет записана в поля этой структуры
46-54 Большую часть времени сервер проводит в этом цикле,
ожидая запросов клиентов. Когда появляется запрос, сервер
вызывает accept_call, функцию, написанную автором
сервера, которая возвращает дескриптор файла, указывающий
на альтернативную транспортную точку, через которую
сервер будет на самом деле обмениваться данными с
клиентом. Сервер вызывает run_server(), порождая новый
процесс для продолжения коммуникации с клиентом. Далее
сервер продолжает ожидать запросы. Текст accept_call
содержит вызов библиотечной функции t_accept(3N), которая
принимает запрос о соединении, создавая файловый
дескриптор для коммуникации с клиентом.
УСТАНОВЛЕНИЕ СОЕДИНЕНИЯ - ПРИМЕР
КЛИЕНТ
. . .
24
25 if((sndcall = (struct t_call *)t_alloc( fd, T_CALL,
26 T_ADDR)) == NULL {
27 t_error("t_alloc failed");
28 exit(3);
29 }
30 sndcall->addr.len = sizeof(int);
31 *(int *)sndcall->addr.buf = SVR_ADDR;
32
33 if( t_connect(fd, sndcall, NULL) < 0) {
34 t_error("t_connect failed for fd");
35 exit(4);
36 }
. . .
СЕРВЕР
. . .
41 if((call = (struct t_call *)t_alloc(listen_fd,T_CALL,
42 T_ALL)) == NULL) {
43 t_error("t_alloc of t_call failed"); exit(5);
44
45 }
46 while (1) {
47 if(t_listen(listen_fd, call) < 0) {
48 t_error("t_listen failed - listen_fd");
49 exit(6();
50 }
51 if(( conn_fd = accept_call(listen_fd, call))
52 != DISCONNECT)
53 run_server(listen_fd);
54 }
. . .