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++)