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

ПРИМЕЧАНИЕ

Когда мы проверяем, соответствует ли количество возвращенной управляющей информации по меньшей мере размеру длинного целого, нужно проявить осторожность, преобразуя значение sizeof в целое число. Оператор sizeof возвращает целое число без знака, но существует вероятность того, что значение возвращенного поля len будет -1. Поскольку при выполнении операции сравнения слева располагается значение со знаком, а справа — без знака, компилятор преобразует значение со знаком в значение без знака. Если рассматривать -1 как целое без знака в архитектуре с дополнением до 2, это число получается очень большим, то есть -1 оказывается больше 4 (если предположить, что длинное целое число занимает 4 байта).

Обработка ответа

31-33 Если ответ — это сообщение T_BIND_ACK, то связывание прошло успешно, и мы возвращаемся. Фактический адрес, связанный с точкой доступа, возвращается в элементе addr нашей структуры bind_ack, которую мы игнорируем.

34-39 Если ответ — это сообщение T_ERROR_ACK, мы проверяем, было ли сообщение получено целиком, и выводим три значения, содержащиеся в возвращенной структуре. В этой простой программе при возникновении ошибки мы просто прекращаем выполнение и ничего не возвращаем вызывающему процессу.

Чтобы увидеть ошибки, которые могут возникнуть в результате запроса на связывание, мы слегка изменим нашу функцию main и попробуем связать какой- либо порт, отличный от 0. Например, если мы попробуем связать порт 1 (что требует прав привилегированного пользователя, так как это порт с номером меньше 1024), мы получим следующий результат:

solaris % tpi_daytime 127.0.0.1

T_ERROR_ACK from bind (3, 0)

В этой системе значение константы EACCESS равно 3. Если мы поменяем номер порта, задав значение большее 1023, но используемое в настоящий момент другой точкой доступа TCP, мы получим:

solaris % tpi_daytime 127.0.0.1

T_ERROR_ACK from bind (23, 0)

В данной системе значение константы EADDRBUSY равно 23.

Следующая функция показана в листинге 31.4. Это функция tpi_connect, устанавливающая соединение с сервером.

Листинг 31.4. Функция tpi_connect: установление соединения с сервером

//streams/tpi_connect.c

 1 #include "tpi_daytime.h"

 2 void

 3 tpi_connect(int fd, const void *addr, size_t addrlen)

 4 {

 5  struct {

 6   struct T_conn_req msg_hdr;

 7   char addr[128];

 8  } conn_req;

 9  struct {

10   struct l_conn_con msg_hdr;

11   char addr[128];

12  } conn_con;

13  struct strbuf ctlbuf;

14  union T_primitives rcvbuf;

15  struct T_error_ack *error_ack;

16  struct T_discon_ind *discon_ind;

17  int flags;

18  conn_req.msg_hdr.PRIM_type = T_CONN_REQ;

19  conn_req.msg_hdr.DEST_length = addrlen;

20  conn_req.msg_hdr.DEST_offset = sizeof(struct T_conn_req);

21  conn_req.msg_hdr.OPT_length = 0;

22  conn_req.msg_hdr.OPT_offset = 0;

23  memcpy(conn_req.addr, addr, addrlen); /* sockaddr_in{} */

24  ctlbuf.len = sizeof(struct T_conn_req) + addrlen;

25  ctlbuf.buf = (char*)&conn_req;

26  Putmsg(fd, &ctlbuf, NULL, 0);

27  ctlbuf.maxlen = sizeof(union T_primitives);

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))

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

Все книги серии Мастер-класс

Секреты резьбы по дереву
Секреты резьбы по дереву

Изделия из древесины и материалов, имитирующих ее текстуру, привычным образом окружают нас в повседневной жизни, поэтому мы относимся к ней как к чему-то обыденному. Но как только ее коснется умелая рука мастера резьбы по дереву, рождается произведение искусства и раскрываются такие качества древесины, как богатая фактура, разнообразие цветов, особая теплота. Эта книга поможет читателю открыть для себя удивительный мир творчества и познать секреты резьбы по дереву. Автор надеется, что начинающие резчики найдут в ней интересный и полезный материал, который позволит им стать мастерами. В приложении представлены рисунки орнаментов и различных узоров, которые на первых порах можно копировать, а по мере приобретения навыка на их основе разрабатывать свои образцы.

Галина Алексеевна Серикова

Сделай сам / Хобби и ремесла / Руководства / Дом и досуг / Словари и Энциклопедии

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