Книга: UNIX: разработка сетевых приложений

Пример

Пример

Даже если ваша система еще не поддерживает IPv6, вы можете использовать новые функции, заменив вызовы вида

foo.sin_addr.s_addr = inet_addr(cp);

на

inet_pton(AF_INET, cp, &foo.sin_addr);

а также заменив вызовы вида

ptr = inet_ntoa(foo.sin_addr);

на

char str[INET_ADDRSTRLEN];
ptr = inet_ntop(AF_INET, &foo.sin_addr, str, sizeof(str));

В листинге 3.6 представлено простое определение функции inet_pton, поддерживающее только IPv4, а в листинге 3.7 — версия inet_ntop, поддерживающая только IPv4.

Листинг 3.6. Простая версия функции inet_pton, поддерживающая только IPv4

//libfree/inet_pton_ipv4.c
10 int
11 inet_pton(int family, const char *strptr, void *addrptr)
12 {
13  if (family == AF_INET) {
14   struct in_addr in_val;
15   if (inet_aton(strptr, &in_val)) {
16    memcpy(addrptr, &in_val, sizeof(struct in_addr));
17    return (1);
18   }
19   return (0);
20  }
21  errno = EAFNOSUPPORT;
22  return (-1);
23 }

Листинг 3.7. Простая версия функции inet_ntop, поддерживающая только IPv4

//libfree/inet_ntop_ipv4.c
 8 const char *
 9 inet_ntop(int family, const void *addrptr, char *strptr, size_t len)
10 {
11  const u_char *p = (const u_char*)addrptr;
12  if (family == AF_INET) {
13   char temp[INET_ADDRSTRLEN];
14   snprintf(temp, sizeof(temp), "%d.%d.%d.%d",
15    p[0], p[1], p[2], p[3]);
16   if (strlen(temp) >= len) {
17    errno = ENOSPC;
18    return (NULL);
19   }
20   strcpy(strptr, temp);
21   return (strptr);
22  }
23  errno = EAFNOSUPPORT;
24  return (NULL);
25 }

Оглавление книги

Оглавление статьи/книги

Генерация: 0.111. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз