29:  int portNum = 0;

 30:  const char ** ptr;

 31:  char hostName[1024];

 32:  char serviceName[256];

 33:

 34:  /* очистить флаги */

 35:  flags = 0;

 36:

 37:  /* разобрать аргументы командной строки, игнорируя argv[0] */

 38:  ptr = argv + 1;

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

 40:   if (!strcmp(*ptr, '—numerichost')) {

 41:    flags |= NI_NUMERICHOST;

 42:   } else if (!strcmp (*ptr, '--numericserv')) {

 43:    flags |= NI_NUMERICSERV;

 44:   } else if (!strcmp (*ptr, '--namereqd')) {

 45:    flags |= NI_NAMEREQD;

 46:   } else if (!strcmp(*ptr, '--nofqdn')) {

 47:    flags |= NI_NOFQDN;

 48:   } else if (!strcmp (*ptr, '--udp')) {

 49:    flags |= NI_DGRAM;

 50:   } else if (!strcmp(*ptr, '--host')) {

 51:    ptr++;

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

 53:    hostAddress = *ptr;

 54:   } else if (!strcmp(*ptr, '--service')) {

 55:    ptr++;

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

 57:    serviceAddress = *ptr;

 58:   } else

 59:    usage();

 60:

 61:   ptr++;

 62:  }

 63:

 64:  /* необходимы адреса hostAddress, serviceAddress или оба */

 65:  if (!hostAddress && !serviceAddress)

 66:   usage();

 67:

 68:  if (serviceAddress) {

 69:   char * end;

 70:

 71:   portNum = htons(strtol(serviceAddress, &end, 0));

 72:   if (*end) {

 73:    fprintf(stderr, 'сбой при преобразовании %s в число ',

 74:     serviceAddress);

 75:    return 1;

 76:   }

 77:  }

 78:

 79:  if (!hostAddress) {

 80:   addr4.sin_family = AF_INET;

 81:   addr4.sin_port = portNum;

 82:  } else if (!strchr(hostAddress, ':')) {

 83:   /* Если hostAddress содержит двоеточие, то предполагаем версию IPv6.

 84:      В противном случае это IPv4 */

 85:

 86:   if (inet_pton(AF_INET, hostAddress,

 87:    &addr4.sin_addr) <= 0) {

 88:    fprintf(stderr, 'ошибка преобразования IPv4-адреса %s ',

 89:     hostAddress);

 90:    return 1;

 91:   }

 92:

 93:   addr4.sin_family = AF_INET;

 94:   addr4.sin_port = portNum;

 95:  } else {

 96:

 97:   memset(&addr6, 0, sizeof(addr6));

 98:

 99:   if (inet_pton(AF_INET6, hostAddress,

100:    &addr6.sin6_addr) <= 0) {

101:    fprintf(stderr, 'ошибка преобразования IPv6-адреса %s ',

102:     hostAddress);

103:    return 1;

104:   }

105:

106:   addr6.sin6_family = AF_INET6;

107:   addr6.sin6_port = portNum;

108:   addr = (struct sockaddr *) &addr6;

109:   addrLen = sizeof(addr6);

110:  }

111:

112:  if (!serviceAddress) {

113:   rc = getnameinfo(addr, addrLen, hostName, sizeof(hostName),

114:    NULL, 0, flags);

115:  } else if (!hostAddress) {

116:   rc = getnameinfo(addr, addrLen, NULL, 0,

117:    serviceName, sizeof(serviceName), flags);

118:  } else {

119:   rc = getnameinfo(addr, addrLen, hostName, sizeof(hostName),

120:    serviceName, sizeof(serviceName), flags);

121:  }

122:

123:  if (rc) {

124:   fprintf(stderr, 'сбой обратного поиска: %s ',

125:    gai_strerror(rc));

126:   return 1;

127:  }

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату