[<<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   }
  . . .