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

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

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

 char** h_aliases;   /* псСвдонимы (Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ NULL) */

 int h_addrtype;     /* Ρ‚ΠΈΠΏ адрСса хоста */

 int h_length;       /* Π΄Π»ΠΈΠ½Π° адрСса */

 char** h_addr_list; /* список адрСсов (Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉΡΡ NULL) */

};

Π—Π΄Π΅ΡΡŒ h_name β€” каноничСскоС имя хоста. Массив h_aliases содСрТит всС псСвдонимы Π΄Π°Π½Π½ΠΎΠ³ΠΎ хоста. ПослСдняя запись Π² h_aliases β€” это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ NULL, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎ ΠΊΠΎΠ½Ρ†Π΅ массива.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ h_addrtype сообщаСт Ρ‚ΠΈΠΏ адрСса хоста. Π’ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ AF_INET. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ создавались для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ IPv6, ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ адрСсов[147]. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‡Π»Π΅Π½ h_length ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… адрСсов для Π΄Π°Π½Π½ΠΎΠ³ΠΎ хоста. Для адрСсов AF_INET эта Π΄Π»ΠΈΠ½Π° Ρ€Π°Π²Π½Π° sizeof(struct in_addr). ПослСдний элСмСнт h_addr_list прСдставляСт собой массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° адрСса Π΄Π°Π½Π½ΠΎΠ³ΠΎ хоста, послСдний ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π²Π΅Π½ NULL для обозначСния ΠΊΠΎΠ½Ρ†Π° списка. Если h_addrtype Ρ€Π°Π²Π΅Π½ AF_INET, Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² этом спискС ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° структуру struct in_addr.

Π”Π²Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ прСобразования ΠΌΠ΅ΠΆΠ΄Ρƒ IP-Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ хостов. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΈΠ· Π½ΠΈΡ… gethostbyname() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ struct hostent для ΠΈΠΌΠ΅Π½ΠΈ хоста. Вторая β€” gethostbyaddr() β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ машинС с Π΄Π°Π½Π½Ρ‹ΠΌ IP-адрСсом.

#include <netdb.h>


struct hostent * gethostbyname(const char * name);

struct hostent * gethostbyaddr(const char * addr, int len, int type);

ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° struct hostent. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пСрСзаписана ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, поэтому всС значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ·ΠΆΠ΅, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ.

Ѐункция gethostbyname() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ имя хоста. Ѐункция gethostbyaddr() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вмСстС ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ адрСс. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… addr ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° struct in_addr. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ len устанавливаСт Π΄Π»ΠΈΠ½Ρƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ addr. ПослСдний type ΠΈΠ·Π»Π°Π³Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ адрСса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² имя хоста (AF_INET для IPv4-адрСсов).

Если Π²ΠΎ врСмя поиска ΠΈΠΌΠ΅Π½ΠΈ хоста происходят ошибки, Ρ‚ΠΎ ΠΊΠΎΠ΄ ошибки пСрСдаСтся Π² h_errno. Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ herror() распСчатываСт описаниС ошибки (данная функция ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° стандартной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ perror()).

ЕдинствСнный ΠΊΠΎΠ΄ ошибки, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ тСстируСтся Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, это NETDB_INTERNAL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΉ систСмный Π²Ρ‹Π·ΠΎΠ². ΠŸΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ этой ошибки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ errno содСрТит описаниС Ρ‚ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, которая ΠΏΡ€ΠΈΠ²Π΅Π»Π° ΠΊ ΠΎΡ‚ΠΊΠ°Π·Ρƒ.

17.8.3. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ поиска ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ хоста с использованиСм унаслСдованных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

НиТС приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ inet_aton(), inet_ntoa(), gethostbyname(), gethostbyaddr(). Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ СдинствСнный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ ΠΈΠΌΠ΅Π½Π΅ΠΌ хоста, Π»ΠΈΠ±ΠΎ IP-адрСсом Π² дСсятичном прСдставлСнии с Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ. Она отыскиваСт хост ΠΈ распСчатываСт всС ΠΈΠΌΠ΅Π½Π° хоста ΠΈ IP-адрСса, ассоциированныС с Π½ΠΈΠΌ.

Π›ΡŽΠ±ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ дСсятичным адрСсом, считаСтся IP-Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ, Π° Π½Π΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ хоста.

 1: /* lookup.с */

 2:

 3: /* ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π»ΠΈΠ±ΠΎ имя хоста, Π»ΠΈΠ±ΠΎ IP-адрСс Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚

 4:    каноничСскоС имя хоста для Π΄Π°Π½Π½ΠΎΠ³ΠΎ хоста ΠΈ всС IP-Π½ΠΎΠΌΠ΅Ρ€Π° ΠΈ ΠΈΠΌΠ΅Π½Π°

 5:    хостов, ассоциированныС с Π½ΠΈΠΌ. */

 6:

 7: #include <netdb.h> /* для gethostby* */

 8: #include <sys/socket.h>

 9: #include <netinet/in.h> /* для адрСсных структур */

10: #include <arpa/inet.h> /* для inet_ntoa() */

11: #include <stdio.h>

12:

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

14:  struct hostent * answer;

15:  struct in_addr address, ** addrptr;

16:  char ** next;

17:

18:  if (argc != 2) {

19:   fprintf(stderr, "поддСрТиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚\n");

20:   return 1;

21:  }

22:

23:  /* Если Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ выглядит ΠΊΠ°ΠΊ IP, Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ

24:     ΠΈ выполняСт ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ поиск ΠΈΠΌΠ΅Π½ΠΈ */

25:  if (inet_aton(argv[1], &address))

26:   answer = gethostbyaddr((char *)&address, sizeof(address),

27:                           AF_INET);

28:  else

29:   answer = gethostbyname(argv[1])

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>

 6:

 7: /* ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° TCP ΠΈ всС псСвдонимы слуТбы,

 8:    ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС */

 9:

10: /* services.с отыскиваСт Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° для слуТбы */

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

12:  struct servent * service;

13:  char ** ptr;

14:

15:  if (argc != 2) {

16:   fprintf(stderr, "поддСрТиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚\n");

17:   return 1;

18:  }

19:

20:  /* поиск слуТбы Π² /etc/services, Π² случаС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ

21:     пСрСдаСтся ошибка */

22:  service = getservbyname(argv[1] , "tcp");

23:  if (!service) {

24:   herror("getservbyname failed");

25:   return 1;

26:  }

27:

28:  printf("слуТба: %s\n", service->s_name);

29:  printf("tcp-ΠΏΠΎΡ€Ρ‚: %d\n", ntohs(service->s_port));

31:  /* ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ всС псСвдонимы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ данная слуТба */

32:  if (*service->s_aliases) {

33:   printf("псСвдонимы:");

34:   for (ptr = service->s_aliases; *ptr; ptr++)