Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

 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>

6: #include <stdio.h>

7: #include <string.h>

8: #include <stdlib.h>

9:

 10: /* Вызывается, если во время обработки командной строки происходит ошибка;

 11: отображает короткое сообщение для пользователя и завершается. */

 12: void usage(void) {

 13: fprintf(stderr, "использование: netlookup [--stream] [--dgram] "

 14: "[--ipv4] [--ipv6] [--name] [--udp]\n");

 15: fprintf (stderr, " [--tcp] [--cfg] "

 16: "[--service <служба>] [--host <имя_хоста>]\n");

 17: exit(1);

 18: }

 19:

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

 21: struct addrinfo * addr, * result;

 22: const char ** ptr;

 23: int rc;

  • Читать дальше
  • 1
  • ...
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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