Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 97

Автор Майкл ДТонсон

 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 Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Ρ‡Π΅Ρ€Π΅Π· Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ соСдинСниС (хотя ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ для ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ слуТбы Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½), ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ поиск ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ.

[ [email protected] 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, Ρ‚Π° ΠΆΠ΅ самая ΠΊΠΎΠΌΠ°Π½Π΄Π° выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

[ [email protected] 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;

 24:  struct addrinfo hints;

 25:  const char * serviceName = NULL;

 26:  const char * hostName = NULL;

 27:

 28:  /* ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ структуру подсказок */

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

 30:

 31:  /* Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, игнорируя argv[0]

 32:

 33:     Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° hints, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ serviceName ΠΈ hostName Π±ΡƒΠ΄ΡƒΡ‚

 34:     Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ Π½Π° основС ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². */

 35:  ptr = argv + 1;

 36:  while (*ptr && *ptr[0] == '-') {

 37:   if (!strcmp(*ptr, "--ipv4"))

 38:    hints.ai_family = PF_INET;

 39:   else if (!strcmp(*ptr, "--ipv6"))

 40:    hints.ai_family = PF_INET6;

 41:   else if (!strcmp(*ptr, "--stream"))

 42:    hints.ai_socktype = SOCK_STREAM;

 43:   else if (!strcmp(*ptr, "--dgram"))

 44:    hints.ai_socktype = SOCK_DGRAM;

 45:   else if (!strcmp(*ptr, "--name"))

 46:    hints.ai_flags |= AI_CANONNAME;

 47:   else if (!strcmp(*ptr, "--cfg"))

 48:    hints.ai_flags |= AI_ADDRCONFIG;

 49:   else if (!strcmp(*ptr, "--tcp")) {

 50:    hints.ai_protocol = IPPROTO_TCP;

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

 52:    hints.ai_protocol = IPPROTO_UDP;

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

 54:    ptr++;

 55:    if (!*ptr) usage();

 56:    hostName = *ptr;

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

 58:    ptr++;

 59:    if (!*ptr) usage();

 60:    serviceName = *ptr;

 61:   } else

 62:    usage();

 63:

 64:   ptr++;

 65:  }

 66:

 67:  /* Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΠΈΠΌΠ΅Π½Π° hostName, serviceName ΠΈΠ»ΠΈ ΠΎΠ±Π° */

 68:  if (!hostName && !serviceName)

 69:   usage();

 70:

 71:  if ((rc = getaddrinfo(hostName, serviceName, &hints,

 72:   &cresult))) {

 73:   fprintf(stderr, "сбой поиска слуТбы: %s\n",

 74:    gai_strerror(rc));

 75:   return 1;

 76:  }

 77:

 78:  /* ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ связному списку, отобраТая всС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ */

 79:  addr = result;

 80:  while (addr) {

 81:   switch (addr->ai_family) {

 82:   case PF_INETs: printf("IPv4");

 83:    break;

 84:   case PF_INET6: printf("IPv6");

 85:    break;

 86:   default: printf("(%d) addr->ai_family);

 87:    break;

 88:   }

 89:

 90:   switch (addr->ai_socktype) {

 91:   case SOCK_STREAM: printf("\tstream");

 92:    break;

 93:   case SOCK_DGRAM: printf("\tdgram");

 94:    break;

 95:   case SOCK_RAW: printf("\traw");

 96:    break;

 97:   default: printf("\t(%d)

 98:    addr->ai_socktype);

 99:    break;

100:   }

101:

102:   if (addr->ai_family == PF_INET ||

103:    addr->ai_family == PF_INET6)

104:    switch (addr->ai_protocol) {

105:    case IPPROTO_TCP: printf("\ttcp");

106:     break;

107:    case IPPROTO_UDP: printf("\tudp");

108:     break;

109:    case IPPROTO_RAW: printf("\traw");

110:     break;

111:    default: printf("\t(%d)

112:     addr->ai_protocol);

113:     break;

114:    }

115:   else

116:    printf("\t");