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

Тут можно читать онлайн Майкл Джонсон - Разработка приложений в среде Linux. Второе издание - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-osnet, издательство Вильямс, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Разработка приложений в среде Linux. Второе издание
  • Автор:
  • Жанр:
  • Издательство:
    Вильямс
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    978-5-8459-1143-8
  • Рейтинг:
    3.8/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.

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

Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)

Разработка приложений в среде Linux. Второе издание - читать книгу онлайн бесплатно, автор Майкл Джонсон
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

135:

136: if (serviceName)

137: printf("\tпорт%d", ntohs(inetaddr->sin6_port));

138:

139: if (hostName)

140: printf("\tхост%s",

141: inet_ntop(AF_INET6, &inetaddr->sin6_addr,

142: nameBuf, sizeof(nameBuf)));

143: }

144:

145: if (addr->ai_canonname)

146: printf("\tname%s", addr->ai_canonname);

147:

148: printf("\n");

149:

150: addr = addr->ai_next;

151: }

152:

153: /* очистить результаты getaddrinfo() */

154: freeaddrinfo(result);

155:

156: return 0;

157: }

В отличие от большинства библиотечных функций, getaddrinfo()возвращает целое число, которое равно нулю в случае успеха, и описывает ошибку в случае неудачи. Такие функции, как правило, не используют errno. В табл. 17.3 описаны различные коды ошибок, которые могут возвращать подобные функции.

Таблица 17.3. Ошибки поиска соответствия адреса и имени

Ошибка Описание
EAI_AGAIN Имя не может быть найдено. Повторный поиск может оказаться успешным.
EAI_BADFLAGS В функцию переданы недействительные флаги.
EAI_FAIL В процессе поиска соответствия возникла постоянная ошибка.
EAI_FAMILY Семейство адресов не распознано.
EAI_MEMORY Запрос на выделение памяти не выполнен.
EAI_NONAME Имя или адрес невозможно преобразовать.
EAI_OVERFLOW Переданный буфер слишком мал.
EAI_SERVICE Для данного типа сокета служба не существует.
EAI_SOCKTYPE Был передан недействительный тип сокета.
EAI_SYSTEM Произошла системная ошибка; сама ошибка содержится в переменной errno.

Коды ошибок можно преобразовать в строки, описывающие проблему, с помощью функции gai_strerror().

#include

const char * gai_strerror(int error);

Здесь параметр errorдолжен быть ненулевым значением, возвращенным функцией getaddrinfo(). Если произошла ошибка EAI_SYSTEM, то для получения более точного описания программа должна использовать strerror(errno).

17.5.6. Преобразование адресов в имена

К счастью, переводить IP-адреса и номера портов в имена хостов и служб гораздо проще, чем наоборот.

#include

#include

int getnameinfo(struct sockaddr * addr, socklen_t addrlen,

char * hostname, size_t hostlen,

char * servicename, size_tservicelen, intflags);

Здесь параметр addrуказывает либо на struct sockaddr_in, либо на struct sockaddr_in6, член addrlenсодержит размер структуры, на которую указывает addr. IP-адрес и номер порта, определенные addr, преобразуются в имя хоста, сохраняющееся в ячейке, на которую указывает hostname, и в имя службы, сохраняющееся в servicename.

Один из параметров может равняться NULL, при этом функция getnameinfo()не ищет соответствие имени для данного параметра.

Параметры hostlenи servicelenопределяют, сколько байт доступно в буферах, на которые указывают hostnameи servicenameсоответственно. Если ни одно имя не умещается в доступном пространстве, буфера переполняются и возвращается ошибка ( EAI_OVERFLOW).

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

NI_DGRAM Отыскивается имя службы UDP для указанного порта (вместо имени службы TCP). Примечание . Эти два имени почти всегда идентичны, однако существует несколько портов, определенных только для UDP-портов (протокол прерывания SNMP — один из них), и несколько случаев, когда один и тот же номер порта используется для различных TCP и UDP служб (например, порт 512 применяется и для TCP-службы exec, и для UDP-службы biff).
NI_NAMEREQD Если преобразование IP-адреса в имя хоста завершается неудачей и установлен данный флаг, то функция getnameinfo()возвращает ошибку. В противном случае она возвращает IP-адрес в формате с разделительными точками или двоеточиями.
NI_NOFQDN Имена хостов обычно возвращаются как полностью уточненные имена доменов. Это означает, что возвращается полное имя хоста, а не локальное сокращение. Если, к примеру, установлен данный флаг, вашим хостом является digit.iana.org, и вы ищете IP-адрес, соответствующий www.iana.org, тогда будет возвращено имя хоста www. Поиск имен хостов для остальных машин при этом не затрагивается (в предыдущем примере поиск адреса для www.ietf.orgпредоставит полное имя хоста www.ietf.org.
NI_NUMERICHOST Вместо выполнения поиска имен хостов функция getnameinfo()преобразует IP-адрес в IP-адрес по аналогии с inet_ntop().
NI_NUMERICSERV Номер порта размещается в servicenameв виде форматированной числовой строки (а не преобразуется в имя службы).

Возвращаемые коды для getnameinfo()— те же самые, что и для gethostinfо(); в случае успеха возвращается нуль, в случае неудачи — код ошибки. Полный перечень возможных ошибок приведен в табл. 17.3. Для преобразования этих ошибок в описательные строки служит функция gai_strerror().

Ниже приведен пример, показывающий использование getnameinfo()для выполнения обратного поиска имени для адресов IPv4 и IPv6.

$ ./reverselookup --host ::1

hostname: localhost

$ ./reverselookup --host 127.0.0.1

hostname: localhost

$ ./reverselookup --host 3ffe:b00:c18:1::10

hostname: www.6bone.net

$ ./reverselookup --host 206.123.31.124 --service 80

hostname: www.6bone.net service name: http

1: /* reverselookup.с */

2:

3: #include

4: #include

5: #include

6: #include

7: #include

8: #include

9:

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

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

12: void usage(void) {

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

14: "[--numericserv] [--namereqd] [--udp]\n");

15: fprintf(stderr, " [--nofqdn] "

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

17: exit(1);

18: }

19:

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

21: int flags;

22: const char * hostAddress = NULL;

23: const char * serviceAddress = NULL;

24: struct sockaddr_in addr4;

25: struct sockaddr_in6 addr6;

26: struct sockaddr *addr = (struct sockaddr *) &addr4;

27: int addrLen = sizeof(addr4);

28: int rc;

29: int portNum = 0;

30: const char ** ptr;

31: char hostName[1024];

32: char serviceName[256];

33:

34: /* очистить флаги */

35: flags = 0;

36:

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

38: ptr = argv + 1;

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

40: if (!strcmp(*ptr, "—numerichost")) {

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Майкл Джонсон читать все книги автора по порядку

Майкл Джонсон - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Разработка приложений в среде Linux. Второе издание, автор: Майкл Джонсон. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x