Чтение онлайн

на главную

Жанры

UNIX: разработка сетевых приложений
Шрифт:

28 ctlbuf.len = 0;

29 ctlbuf.buf = (char*)&rcvbuf;

30 flags = RS_HIPRI;

31 Getmsg(fd, &ctlbuf, NULL, &flags);

32 if (ctlbuf.len < (int)sizeof(long))

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; /* длина параметра */

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

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

};

Поделиться:
Популярные книги

Последний Паладин. Том 3

Саваровский Роман
3. Путь Паладина
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 3

Последний попаданец 5

Зубов Константин
5. Последний попаданец
Фантастика:
юмористическая фантастика
рпг
5.00
рейтинг книги
Последний попаданец 5

Убивать чтобы жить 6

Бор Жорж
6. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 6

6 Секретов мисс Недотроги

Суббота Светлана
2. Мисс Недотрога
Любовные романы:
любовно-фантастические романы
эро литература
7.34
рейтинг книги
6 Секретов мисс Недотроги

Измена

Рей Полина
Любовные романы:
современные любовные романы
5.38
рейтинг книги
Измена

Курсант: Назад в СССР 13

Дамиров Рафаэль
13. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 13

Газлайтер. Том 6

Володин Григорий
6. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 6

Купидон с топором

Юнина Наталья
Любовные романы:
современные любовные романы
7.67
рейтинг книги
Купидон с топором

Виконт. Книга 3. Знамена Легиона

Юллем Евгений
3. Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Виконт. Книга 3. Знамена Легиона

Попаданка в деле, или Ваш любимый доктор - 2

Марей Соня
2. Попаданка в деле, или Ваш любимый доктор
Любовные романы:
любовно-фантастические романы
7.43
рейтинг книги
Попаданка в деле, или Ваш любимый доктор - 2

Усадьба леди Анны

Ром Полина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Усадьба леди Анны

Титан империи 2

Артемов Александр Александрович
2. Титан Империи
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Титан империи 2

Вечный. Книга I

Рокотов Алексей
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга I

Убивать чтобы жить 5

Бор Жорж
5. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 5