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

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

Жанры

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

Троан Эрик В.

Шрифт:

 1: /* clientlookup.c */

 2:

 3: #include <netdb.h>

 4: #include <stdio.h>

 5: #include <string.h>

 6:

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

 8: struct addrinfo hints, * addr;

 9: const char * host = argv[1], * service = argv[2];

10: int rc;

11:

12: if (argc != 3) {

13: fprintf(stderr, "требуется
в точности два аргумента\n");

14: return 1;

15: }

16:

17: memset(&hints, 0, sizeof(hints));

18:

19: hints.ai_socktype = SOCK_STREAM;

20: hints.ai_flags = AI_ADDRCONFIG;

21: if ((rc = getaddrinfo(host, service, &hints, &addr)))

22: fprintf(stderr, "сбой поиска\n");

23: else

24: freeaddrinfo(addr);

25:

26: return 0;

27: }

Давайте обратим внимание на строки 17–24 этой программы. После очистки структуры hints приложение запрашивает адреса

SOCK_STREAM
, которые используют протокол, сконфигурированный на локальной системе (путем установки флага
AI_ADDRCONFIG
). Затем активизируется функция
getaddrinfo
с именем хоста, именем службы, подсказками и в случае невозможности найти соответствие отображается сообщение об ошибке. Если все проходит нормально, то первый элемент в связном списке, на который указывает
addr
, представляет собой соответствующий адрес, который программа может использовать для установки соединения с указанной службой и хостом. Программа не решает, через какой протокол (IPv4 или IPv6) соединение будет лучшим.

Серверные приложения немного проще. В них, как правило, требуется согласиться на соединение с определенным портом, при этом на всех адресах. Если установлены флаги

AI_PASSIVE
, функция
getaddrinfo
возвращает адрес, вынуждающий ядро разрешать все соединения (со всеми адресами, которые оно знает) при условии, что в качестве первого параметра передается
NULL
. Как и в клиентском примере, используется
AI_ADDRCONFIG
, дабы убедиться, что возвращаемый адрес соответствует протоколу, который поддерживает данная машина.

 1: /* serverlookup.с */

 2:

 3: #include <netdb.h>

 4: #include <stdio.h>

 5: #include <string.h>

 6:

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

 8: struct addrinfo hints, * addr;

 9: const char * service = argv[1];

10: int rc;

11:

12: if (argc != 3) {

13: fprintf(stderr, "требуется в точности один аргумент\n");

14: return 1;

15: }

16:

17: memset(&hints, 0, sizeof(hints));

18:

19: hints.ai_socktype = SOCK_STREAM;

20: hints.ai_flags = AI_ADDRCONFIG | AI_PASSIVE;

21: if ((rc = getaddrinfo(NULL, service, &hints, &addr)))

22: fprintf(stderr, "сбой
поиска\n");

23: else

24: freeaddrinfo(addr);

25:

26: return 0;

27: }

После успешного завершения работы

getaddrinfo
первый узел в связном списке может использоваться сервером для установки сокета.

Следующий пример демонстрирует куда более полезную программу. Она предоставляет интерфейс командной строки для большинства возможностей

getaddrinfo
. Она дает возможность пользователю указывать имя хоста или имя службы (или оба имени), тип сокета (потоковый или дейтаграммный), семейство адресов, протокол (TCP или UDP). Пользователь может также запрашивать программу отображать каноническое имя или только те адреса для протоколов, для которых сконфигурирована машина (через флаг
AI_ADDRCONFIG
). Ниже показано, как можно применить программу для извлечения адреса для telnet-соединения с локальной машиной (данная машина сконфигурирована и под IPv4, и под IPv6).

$ ./netlookup --hdst localhost --service telnet

IPv6 stream tcp port 23 host ::1

IPv6 dgram udp port 23 host ::l

IPv4 stream tcp port 23 host 127.0.0.1

IPv4 dgram udp port 23 host 127.0.0.1

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

[ewt@patton code]$ ./netlookup --host localhost -service telnet --stream

IPv6 stream tcp port 23 host ::1

IPv4 stream tcp port 23 host 127.0.0.1

После возврата локальной машины в исходное состояние для IPv6, та же самая команда выглядит следующим образом.

[ewt@patton code]$ ./netlookup --host localhost --service telnet —stream

IPv4 stream tcp port 23 host 127.0.0.1

Вот так выглядит поиск соответствия для хоста Internet, который имеет и IPv4, и IPv6 конфигурации.

$ ./netlookup --host www.6bone.net —stream

IPv6 stream tcp host 3ffe:b00:c18:1::10

IPv4 stream tcp host 206.123.31.124

Для того чтобы увидеть полный перечень опций командной строки, которые предлагает

netlookup.с
, запустите данную программу без параметров.

1: /* netlookup.с */

2:

3: #include <netdb.h>

4: #include <arpa/inet.h>

5: #include <netinet/in.h>

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

Свадьба по приказу, или Моя непокорная княжна

Чернованова Валерия Михайловна
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Свадьба по приказу, или Моя непокорная княжна

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Отец моего жениха

Салах Алайна
Любовные романы:
современные любовные романы
7.79
рейтинг книги
Отец моего жениха

Вадбольский

Никитин Юрий Александрович
1. Вадбольский
Фантастика:
попаданцы
5.00
рейтинг книги
Вадбольский

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

В зоне особого внимания

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

Таня Гроттер и магический контрабас

Емец Дмитрий Александрович
1. Таня Гроттер
Фантастика:
фэнтези
8.52
рейтинг книги
Таня Гроттер и магический контрабас

Бастард Императора. Том 2

Орлов Андрей Юрьевич
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бастард Императора. Том 2

Кодекс Крови. Книга ХI

Борзых М.
11. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХI

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9

Потусторонний. Книга 1

Погуляй Юрий Александрович
1. Господин Артемьев
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Потусторонний. Книга 1