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");