Майкл Джонсон - Разработка приложений в среде Linux. Второе издание
- Название:Разработка приложений в среде Linux. Второе издание
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2007
- Город:Москва
- ISBN:978-5-8459-1143-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Майкл Джонсон - Разработка приложений в среде Linux. Второе издание краткое содержание
Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.
Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.
Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
17.8.3. Пример поиска информации хоста с использованием унаследованных функций
Ниже приводится пример программы, использующей inet_aton()
, inet_ntoa()
, gethostbyname()
, gethostbyaddr()
. Она принимает единственный аргумент, который может быть либо именем хоста, либо IP-адресом в десятичном представлении с точками. Она отыскивает хост и распечатывает все имена хоста и IP-адреса, ассоциированные с ним.
Любой аргумент, который является действительным десятичным адресом, считается IP-номером, а не именем хоста.
1: /* lookup.с */
2:
3: /* Получает либо имя хоста, либо IP-адрес в командной строке, выводит
4: каноническое имя хоста для данного хоста и все IP-номера и имена
5: хостов, ассоциированные с ним. */
6:
7: #include /* для gethostby* */
8: #include
9: #include /* для адресных структур */
10: #include /* для inet_ntoa() */
11: #include
12:
13: int main(int argc, const char ** argv) {
14: struct hostent * answer;
15: struct in_addr address, ** addrptr;
16: char ** next;
17:
18: if (argc != 2) {
19: fprintf(stderr, "поддерживается только одиночный аргумент\n");
20: return 1;
21: }
22:
23: /* Если аргумент выглядит как IP, то принимаем его как таковой
24: и выполняет обратный поиск имени */
25: if (inet_aton(argv[1], &address))
26: answer = gethostbyaddr((char *)&address, sizeof(address),
27: AF_INET);
28: else
29: answer = gethostbyname(argv[1])
30:
31: /* поиск имени хоста не удался */
32: if (!answer) {
33: herror("ошибка поиска хоста");
34: return 1;
35: }
36:
37: printf("Каноническое имя хоста: %s\n", answer->h_name);
38:
39: /* если есть псевдонимы, все они выводятся на печать */
40: if (answer->h_aliases[0]) {
41: printf("Псевдонимы:");
42: for(next = answer->h_aliases; *next; next++)
43: printf(" %s", *next);
44: printf("\n");
45: }
46:
47: /* отобразить все IP-адреса для данной машины */
48: printf("Адреса:");
49: for (addrptr = (structin_addr **) answer->h_addr_list;
50: *addrptr; addrptr++)
51: printf (" %s", inet_ntoa(**addrptr));
52: printf("\n");
53:
54: return 0;
55: }
Ниже показан пример вывода этой программы.
$ ./lookup ftp.netscape.com
Каноническое имя хоста: ftp25.netscape.com
Псевдонимы: ftp.netscape.com anonftp10.netscape.com
Адреса: 207.200.74.21
17.8.4. Поиск номеров портов
Новые функции getaddrinfo()
и getnameinfo()
предлагают простое выполнение преобразований имен служб в номера портов с одновременным определением имени хоста. В старых реализациях поиск имен служб проводился абсолютно независимо от поиска имен хостов. Доступ к именам служб можно получить через функцию getservbyname()
.
#include
struct servent * getservbyname(const char * name,
const char * protocol);
Первый параметр name
представляет собой имя службы, о которой в приложении требуется информация. Параметр protocol
указывает протокол для использования. База данных служб содержит информацию о других протоколах (особенно UDP); конкретное определение протокола позволяет функции игнорировать информацию по другим протоколам. Параметр protocol
обычно является строкой "tcp"
, хотя могут использоваться и другие имена протоколов, например, "udp"
.
Функция getservbyname()
возвращает указатель на структуру, которая содержит информацию о запрашиваемой службе. Информация может перезаписываться при последующем вызове getservbyname()
, поэтому важные данные нужно сохранять в приложении. Функция getservbyname()
возвращает следующую информацию:
#include
struct servent {
char * s_name; /* имя службы */
char ** s_aliases; /* псевдонимы службы */
int s_port; /* номер порта */
char * s_proto; /* протокол для использования */
}
Каждая служба может иметь несколько имен, ассоциированных с ней, но только один номер порта. Переменная s_name
регистрирует каноническое имя службы, s_port
содержит официальный номер порта данной службы (представленный в сетевом порядке байтов), s_proto
представляет протокол для использования (например, "tcp"
). Член s_aliases
является массивом указателей псевдонимов службы (указатель NULL
обозначает конец списка).
Если функция не выполняет свою работу, то она возвращает NULL
и устанавливает h_errno
. Ниже приведен пример программы, которая извлекает TCP-службу, указанную в командной строке, и выводит на экран каноническое имя, номер порта и все псевдонимы данной службы.
1: /* services.с */
2:
3: #include
4: #include
5: #include
6:
7: /* Отображает номер порта TCP и все псевдонимы службы,
8: указанной в командной строке */
9:
10: /* services.с отыскивает номер порта для службы */
11: int main(int argc, const char ** argv) {
12: struct servent * service;
13: char ** ptr;
14:
15: if (argc != 2) {
16: fprintf(stderr, "поддерживается только одиночный аргумент\n");
17: return 1;
18: }
19:
20: /* поиск службы в /etc/services, в случае неудачи
21: передается ошибка */
22: service = getservbyname(argv[1] , "tcp");
23: if (!service) {
24: herror("getservbyname failed");
25: return 1;
26: }
27:
28: printf("служба: %s\n", service->s_name);
29: printf("tcp-порт: %d\n", ntohs(service->s_port));
31: /* отобразить все псевдонимы, которые имеет данная служба */
32: if (*service->s_aliases) {
33: printf("псевдонимы:");
34: for (ptr = service->s_aliases; *ptr; ptr++)
35: printf(" %s", *ptr);
36: printf("\n");
37: }
38:
39: return 0;
40: }
Ниже показан пример запуска программы. Обратите внимание на то, что она извлекает службы либо по каноническому имени, либо по псевдониму.
$ ./services http
служба: http
tcp-порт: 80
$ ./services source
служба: chargen
tcp-порт: 19
псевдонимы: ttytst source
Глава 18
Время
18.1. Вывод времени и даты
18.1.1. Представление времени
В системах Unix и Linux время отслеживается в секундах до или после начала эпохи, которое определяется как полночь 1 января 1970 года по UTC [148] UTC — Universal Coordinated Time (универсальное синхронизированное время), на которое иногда ошибочно ссылаются как на UCT, приблизительно эквивалентное среднему времени по Гринвичу (GMT) и зулу. Описание всех часовых поясов выходит за рамки материала, рассматриваемого в настоящей книге.
. Положительные значения времени относятся к периоду после начала эпохи; отрицательные — до начала эпохи. Для того чтобы обеспечить работу процессов в режиме текущего времени, в Linux, как и во всех остальных версиях Unix, предусмотрен системный вызов time()
.
Интервал:
Закладка: