Троан Эрик В.
Шрифт:
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 <netdb.h>
struct servent * getservbyname(const char * name,
const char * protocol);
Первый параметр
name
представляет собой имя службы, о которой в приложении требуется информация. Параметр protocol
указывает протокол для использования. База данных служб содержит информацию о других протоколах (особенно UDP); конкретное определение протокола позволяет функции игнорировать информацию по другим протоколам. Параметр protocol
обычно является строкой "tcp"
, хотя могут использоваться и другие имена протоколов, например, "udp"
. Функция
getservbyname
возвращает указатель на структуру, которая содержит информацию о запрашиваемой службе. Информация может перезаписываться при последующем вызове getservbyname
, поэтому важные данные нужно сохранять в приложении. Функция getservbyname
возвращает следующую информацию: #include <netdb.h>
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 <netdb.h>
4: #include <netinet/in.h>
5: #include <stdio.h>