Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

 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 в число\n",

 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\n",

 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\n",

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\n",

125: gai_strerror(rc));

126: return 1;

127: }

128:

129: if (hostAddress)

  • Читать дальше
  • 1
  • ...
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: