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
',
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(' stream');
92: break;
93: case SOCK_DGRAM: printf(' dgram');
94: break;
95: case SOCK_RAW: printf(' raw');
96: break;
97: default: printf(' (%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(' tcp');
106: break;
107: case IPPROTO_UDP: printf(' udp');
108: break;
109: case IPPROTO_RAW: printf(' raw');
110: break;
111: default: printf(' (%d)
112: addr->ai_protocol);
113: break;
114: }
115: else
116: printf(' ');
117:
118: /* отобразить информацию и для IPv4-, и для IPv6-адресов */
119:
120: if (addr->ai_family == PF_INET) {
121: struct sockaddr_in * inetaddr = (void*)addr->ai_addr;
122: char nameBuf[INET_ADDRSTRLEN];
123:
124: if (serviceName)
125: printf(' порт%d', ntohs(inetaddr->sin_port));
126:
127: if (hostName)
128: printf(' хост%s',