» » » » Майкл Джонсон - Разработка приложений в среде Linux. Второе издание

Майкл Джонсон - Разработка приложений в среде Linux. Второе издание

На нашем литературном портале можно бесплатно читать книгу Майкл Джонсон - Разработка приложений в среде Linux. Второе издание, Майкл Джонсон . Жанр: Программное обеспечение. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале litmir.org.
Майкл Джонсон - Разработка приложений в среде Linux. Второе издание
Название: Разработка приложений в среде Linux. Второе издание
ISBN: -
Год: -
Дата добавления: 3 июль 2019
Количество просмотров: 439
Читать онлайн

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту readbookfedya@gmail.com для удаления материала

Разработка приложений в среде Linux. Второе издание читать книгу онлайн

Разработка приложений в среде Linux. Второе издание - читать бесплатно онлайн , автор Майкл Джонсон
Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.
1 ... 95 96 97 98 99 ... 150 ВПЕРЕД
Перейти на страницу:

 1: /* clientlookup.c */

 2:

 3: #include <netdb.h>

 4: #include <stdio.h>

 5: #include <string.h>

 6:

 7: int main(int argc, const char ** argv) {

 8:  struct addrinfo hints, * addr;

 9:  const char * host = argv[1], * service = argv[2];

10:  int rc;

11:

12:  if (argc != 3) {

13:   fprintf(stderr, "требуется в точности два аргументаn");

14:   return 1;

15:  }

16:

17:  memset(&hints, 0, sizeof(hints));

18:

19:  hints.ai_socktype = SOCK_STREAM;

20:  hints.ai_flags = AI_ADDRCONFIG;

21:  if ((rc = getaddrinfo(host, service, &hints, &addr)))

22:   fprintf(stderr, "сбой поискаn");

23:  else

24:   freeaddrinfo(addr);

25:

26:  return 0;

27: }

Давайте обратим внимание на строки 17–24 этой программы. После очистки структуры hints приложение запрашивает адреса SOCK_STREAM, которые используют протокол, сконфигурированный на локальной системе (путем установки флага AI_ADDRCONFIG). Затем активизируется функция getaddrinfo() с именем хоста, именем службы, подсказками и в случае невозможности найти соответствие отображается сообщение об ошибке. Если все проходит нормально, то первый элемент в связном списке, на который указывает addr, представляет собой соответствующий адрес, который программа может использовать для установки соединения с указанной службой и хостом. Программа не решает, через какой протокол (IPv4 или IPv6) соединение будет лучшим.

Серверные приложения немного проще. В них, как правило, требуется согласиться на соединение с определенным портом, при этом на всех адресах. Если установлены флаги AI_PASSIVE, функция getaddrinfo() возвращает адрес, вынуждающий ядро разрешать все соединения (со всеми адресами, которые оно знает) при условии, что в качестве первого параметра передается NULL. Как и в клиентском примере, используется AI_ADDRCONFIG, дабы убедиться, что возвращаемый адрес соответствует протоколу, который поддерживает данная машина.

 1: /* serverlookup.с */

 2:

 3: #include <netdb.h>

 4: #include <stdio.h>

 5: #include <string.h>

 6:

 7: int main(int argc, const char ** argv) {

 8:  struct addrinfo hints, * addr;

 9:  const char * service = argv[1];

10:  int rc;

11:

12:  if (argc != 3) {

13:   fprintf(stderr, "требуется в точности один аргументn");

14:   return 1;

15:  }

16:

17:  memset(&hints, 0, sizeof(hints));

18:

19:  hints.ai_socktype = SOCK_STREAM;

20:  hints.ai_flags = AI_ADDRCONFIG | AI_PASSIVE;

21:  if ((rc = getaddrinfo(NULL, service, &hints, &addr)))

22:   fprintf(stderr, "сбой поискаn");

23:  else

24:   freeaddrinfo(addr);

25:

26:  return 0;

27: }

После успешного завершения работы getaddrinfo() первый узел в связном списке может использоваться сервером для установки сокета.

Следующий пример демонстрирует куда более полезную программу. Она предоставляет интерфейс командной строки для большинства возможностей getaddrinfo(). Она дает возможность пользователю указывать имя хоста или имя службы (или оба имени), тип сокета (потоковый или дейтаграммный), семейство адресов, протокол (TCP или UDP). Пользователь может также запрашивать программу отображать каноническое имя или только те адреса для протоколов, для которых сконфигурирована машина (через флаг AI_ADDRCONFIG). Ниже показано, как можно применить программу для извлечения адреса для telnet-соединения с локальной машиной (данная машина сконфигурирована и под IPv4, и под IPv6).

$ ./netlookup --hdst localhost --service telnet

IPv6 stream tcp port 23 host ::1

IPv6 dgram  udp port 23 host ::l

IPv4 stream tcp port 23 host 127.0.0.1

IPv4 dgram  udp port 23 host 127.0.0.1

Поскольку для telnet не определен ни один протокол через дейтаграммное соединение (хотя официальный порт для подобной службы зарезервирован), мы рекомендуем ограничить поиск потоковыми протоколами.

[ [email protected] code]$ ./netlookup --host localhost -service telnet --stream

IPv6 stream tcp port 23 host ::1

IPv4 stream tcp port 23 host 127.0.0.1

После возврата локальной машины в исходное состояние для IPv6, та же самая команда выглядит следующим образом.

[ [email protected] code]$ ./netlookup --host localhost --service telnet —stream

IPv4 stream tcp port 23 host 127.0.0.1

Вот так выглядит поиск соответствия для хоста Internet, который имеет и IPv4, и IPv6 конфигурации.

$ ./netlookup --host www.6bone.net —stream

IPv6 stream tcp host 3ffe:b00:c18:1::10

IPv4 stream tcp host 206.123.31.124

Для того чтобы увидеть полный перечень опций командной строки, которые предлагает netlookup.с, запустите данную программу без параметров.

  1: /* netlookup.с */

  2:

  3: #include <netdb.h>

  4: #include <arpa/inet.h>

  5: #include <netinet/in.h>

  6: #include <stdio.h>

  7: #include <string.h>

  8: #include <stdlib.h>

  9:

 10: /* Вызывается, если во время обработки командной строки происходит ошибка;

 11:    отображает короткое сообщение для пользователя и завершается. */

 12: void usage(void) {

 13:  fprintf(stderr, "использование: netlookup [--stream] [--dgram] "

 14:   "[--ipv4] [--ipv6] [--name] [--udp]n");

 15:  fprintf (stderr, " [--tcp] [--cfg] "

 16:   "[--service <служба>] [--host <имя_хоста>]n");

 17:  exit(1);

 18: }

 19:

 20: int main(int argc, const char ** argv) {

 21:  struct addrinfo * addr, * result;

 22:  const char ** ptr;

 23:  int rc;

 24:  struct addrinfo hints;

 25:  const char * serviceName = NULL;

 26:  const char * hostName = NULL;

 27:

 28:  /* очищает структуру подсказок */

 29:  memset(&hints, 0, sizeof(hints));

 30:

 31:  /* анализирует аргументы командной строки, игнорируя argv[0]

 32:

 33:     Структура hints, параметры serviceName и hostName будут

 34:     заполнены на основе переданных аргументов. */

 35:  ptr = argv + 1;

 36:  while (*ptr && *ptr[0] == '-') {

 37:   if (!strcmp(*ptr, "--ipv4"))

 38:    hints.ai_family = PF_INET;

 39:   else if (!strcmp(*ptr, "--ipv6"))

 40:    hints.ai_family = PF_INET6;

 41:   else if (!strcmp(*ptr, "--stream"))

 42:    hints.ai_socktype = SOCK_STREAM;

 43:   else if (!strcmp(*ptr, "--dgram"))

 44:    hints.ai_socktype = SOCK_DGRAM;

 45:   else if (!strcmp(*ptr, "--name"))

 46:    hints.ai_flags |= AI_CANONNAME;

 47:   else if (!strcmp(*ptr, "--cfg"))

 48:    hints.ai_flags |= AI_ADDRCONFIG;

 49:   else if (!strcmp(*ptr, "--tcp")) {

 50:    hints.ai_protocol = IPPROTO_TCP;

 51:   } else if (!strcmp(*ptr, "--udp")) {

 52:    hints.ai_protocol = IPPROTO_UDP;

 53:   } else if (!strcmp(*ptr, "--host")) {

 54:    ptr++;

 55:    if (!*ptr) usage();

 56:    hostName = *ptr;

 57:   } else if (!strcmp(*ptr, "--service")) {

 58:    ptr++;

 59:    if (!*ptr) usage();

 60:    serviceName = *ptr;

 61:   } else

 62:    usage();

 63:

 64:   ptr++;

 65:  }

 66:

 67:  /* необходимы имена hostName, serviceName или оба */

 68:  if (!hostName && !serviceName)

 69:   usage();

 70:

 71:  if ((rc = getaddrinfo(hostName, serviceName, &hints,

 72:   &cresult))) {

 73:   fprintf(stderr, "сбой поиска службы: %sn",

 74:    gai_strerror(rc));

 75:   return 1;

 76:  }

 77:

 78:  /* проходит по связному списку, отображая все результаты */

 79:  addr = result;

 80:  while (addr) {

 81:   switch (addr->ai_family) {

 82:   case PF_INETs: printf("IPv4");

 83:    break;

 84:   case PF_INET6: printf("IPv6");

 85:    break;

 86:   default: printf("(%d) addr->ai_family);

 87:    break;

 88:   }

 89:

 90:   switch (addr->ai_socktype) {

 91:   case SOCK_STREAM: printf("tstream");

 92:    break;

 93:   case SOCK_DGRAM: printf("tdgram");

 94:    break;

 95:   case SOCK_RAW: printf("traw");

 96:    break;

 97:   default: printf("t(%d)

 98:    addr->ai_socktype);

 99:    break;

100:   }

101:

102:   if (addr->ai_family == PF_INET ||

103:    addr->ai_family == PF_INET6)

104:    switch (addr->ai_protocol) {

105:    case IPPROTO_TCP: printf("ttcp");

106:     break;

107:    case IPPROTO_UDP: printf("tudp");

108:     break;

109:    case IPPROTO_RAW: printf("traw");

110:     break;

111:    default: printf("t(%d)

112:     addr->ai_protocol);

113:     break;

114:    }

115:   else

116:    printf("t");

1 ... 95 96 97 98 99 ... 150 ВПЕРЕД
Перейти на страницу:
Комментариев (0)