Разработка приложений в среде 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
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Жена на пробу, или Хозяйка проклятого замка
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Ваше Сиятельство
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Восход. Солнцев. Книга I
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Инвестиго, из медика в маги
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Надуй щеки!
1. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Случайная свадьба (+ Бонус)
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Газлайтер. Том 5
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Мастер Разума III
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Наследник 2
2. Старицкий
Фантастика:
попаданцы
альтернативная история
фэнтези
5.75
рейтинг книги
Неучтенный. Дилогия
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Светлая тьма. Советник
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00