Читаем UNIX: разработка сетевых приложений полностью

33   err_quit("tpi_connect: bad length from getmsg");

34  switch (rcvbuf.type) {

35  case T_OK_ACK:

36   break;

37  case T_ERROR_ACK:

38   if (ctlbuf.len (int)sizeof(struct T_error_ack))

39    err_quit("tpi_connect: bad length for T_ERROR_ACK");

40   error_ack = (struct T_error_ack*)rcvbuf;

41   err_quit("tpi_connect: T_ERROR_ACK from conn %d, %d)",

42    error_ack-TLI_error, error_ack-UNIX_error);

43  default:

44   err_quit("tpi connect, unexpected message type: d", rcvbuf.type);

45  }

46  ctlbuf.maxlen = sizeof(conn_con);

47  ctlbuf.len = 0;

48  ctlbuf.buf = (char*)conn_con;

49  flags = 0;

50  Getmsg(fd, ctlbuf, NULL, flags);

51  if (ctlbuf.len (int)sizeof(long))

52   err_quit("tpi_connect2: bad length from getmsg");

53  switch (conn_con.msg_hdr.PRIM_type) {

54  case T_CONN_CON:

55   break;

56  case T_DISCON_IND:

57   if (ctlbuf.len (int)sizeof(struct T_discon_ind))

58    err_quit("tpi_connect2: bad length for T_DISCON_IND");

59   discon_ind = (struct T_discon_ind*)conn_con.msg_hdr;

60   err_quit("tpi_connect2: T_DISCON_IND from conn (%d)",

61   discon_ind-DISCON_reason);

62  default:

63   err_quit("tpi_connect2: unexpected message type. %d",

64   conn_con.msg_hdr PRIM_type);

65  }

66 }

Заполнение структуры запроса и отправка поставщику

18-26 В TPI определена структура T_conn_req, содержащая адрес протокола и параметры для соединения:

struct T_conn_req {

 long PRIM_type;   /* T_CONN_REQ */

 long DEST_length; /* длина адреса получателя */

 long DEST_offset; /* смещение адреса получателя */

 long OPT_length;  /* длина параметров */

 long OPT_offset;  /* смещение параметров */

 /* затем следуют адреса протокола и параметры соединения */

};

Как и в случае функции tpi_bind, мы определяем свою собственную структуру с именем conn_req, которая включает в себя структуру T_conn_req, а также содержит место для адреса протокола. Мы заполняем структуру conn_req, обнуляя поля OPT_lengthи OPT_offset. Мы вызываем функцию putmsgтолько с управляющей информацией и флагом 0 для отправки сообщения типа M_PROTOвниз по потоку.

Чтение ответа

27-45 Мы вызываем функцию getmsg, ожидая получить в ответ либо сообщение T_OK_ACK, если было начато установление соединения, либо сообщение T_ERROR_ACK(которые мы уже показывали выше). В случае ошибки мы завершаем выполнение программы. Поскольку мы не знаем, сообщение какого типа мы получим, то определяем объединение с именем T_primitivesдля приема всех возможных запросов и ответов и размещаем это объединение в памяти как входной буфер для управляющей информации при вызове функции getmsg.

struct T_ok_ack {

 long PRIM_type;    /* T_OK_ACK */

 long CORRECT_prim; /* корректный примитив */

};

Ожидание завершения установления соединения

46-65 Сообщение T_OK_ACK, полученное нами на предыдущем этапе, указывает лишь на то, что соединение успешно начало устанавливаться. Теперь нам нужно дождаться сообщения T_CONN_CON, указывающего на то, что другой конец соединения подтверждает получение запроса на соединение.

struct T_conn_con {

 long PRIM_type;  /* T_CONN_CON */

 long RES_length; /* длина адреса собеседника */

 long RES_offset; /* смещение адреса собеседника */

 long OPT_length; /* длина параметра */

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT