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

на главную - закладки

Жанры

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

Троан Эрик В.

Шрифт:

Возвращаемые коды для

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 <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, "использование: 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")) {

 41: flags |= NI_NUMERICHOST;

 42: } else if (!strcmp (*ptr, "--numericserv")) {

 43: flags |= NI_NUMERICSERV;

 44: } else if (!strcmp (*ptr, "--namereqd")) {

 45: flags |= NI_NAMEREQD;

 46: } else if (!strcmp(*ptr, "--nofqdn")) {

 47: flags |= NI_NOFQDN;

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

 49: flags |= NI_DGRAM;

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

 51: ptr++;

 52: if (!*ptr) usage;

 53: hostAddress = *ptr;

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

 55: ptr++;

 56: if (!*ptr) usage;

 57: serviceAddress = *ptr;

 58: } else

 59: usage;

 60:

 61: ptr++;

 62: }

 63:

 64: /* необходимы адреса hostAddress, serviceAddress или оба */

 65: if (!hostAddress && !serviceAddress)

 66: usage;

 67:

 68: if (serviceAddress) {

 69: char * end;

 70:

 71: portNum = htons(strtol(serviceAddress, &end, 0));

 72: if (*end) {

 73: fprintf(stderr, "сбой при преобразовании %s в число\n",

 74: serviceAddress);

 75: return 1;

 76: }

 77: }

 78:

 79: if (!hostAddress) {

 80: addr4.sin_family = AF_INET;

 81: addr4.sin_port = portNum;

 82: } else if (!strchr(hostAddress, ':')) {

 83: /* Если hostAddress содержит двоеточие, то предполагаем версию IPv6.

 84: В противном случае это IPv4 */

 85:

 86: if (inet_pton(AF_INET, hostAddress,

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

Часовая башня

Щерба Наталья Васильевна
3. Часодеи
Фантастика:
фэнтези
9.43
рейтинг книги
Часовая башня

Попаданка в Измену или замуж за дракона

Жарова Анита
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Попаданка в Измену или замуж за дракона

На границе империй. Том 9. Часть 3

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Жена на пробу, или Хозяйка проклятого замка

Васина Илана
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Жена на пробу, или Хозяйка проклятого замка

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

Восход. Солнцев. Книга I

Скабер Артемий
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга I

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Надуй щеки!

Вишневский Сергей Викторович
1. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки!

Случайная свадьба (+ Бонус)

Тоцка Тала
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Случайная свадьба (+ Бонус)

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

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

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Наследник 2

Шимохин Дмитрий
2. Старицкий
Фантастика:
попаданцы
альтернативная история
фэнтези
5.75
рейтинг книги
Наследник 2

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Светлая тьма. Советник

Шмаков Алексей Семенович
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Светлая тьма. Советник