конвертировать struct in_addr в текст - PullRequest
3 голосов
/ 26 ноября 2010

просто интересно, есть ли у меня структура in_addr, как мне преобразовать это обратно в имя хоста?

Ответы [ 2 ]

6 голосов
/ 26 ноября 2010

Вы можете использовать getnameinfo(), упаковав struct in_addr в struct sockaddr_in:

int get_host(struct in_addr addr, char *host, size_t hostlen)
{
    struct sockaddr_in sa = { .sin_family = AF_INET, .sin_addr = my_in_addr };

    return getnameinfo(&sa, sizeof sa, host, hostlen, 0, 0, 0);
}
4 голосов
/ 26 ноября 2010

Современный код должен использовать не struct in_addr напрямую, а sockaddr_in.Еще лучше было бы никогда вообще не создавать и не обращаться к каким-либо структурам sockaddr, а делать все через библиотечные вызовы getaddrinfo и getnameinfo.Например, чтобы найти имя хоста или IP-адрес текстовой формы:

struct addrinfo *ai;
if (getaddrinfo("8.8.8.8", 0, 0, &ai)) < 0) goto error;

И получить имя (или IP-адрес текстовой формы, если он не разрешается в обратном направлении) адреса:

if (getnameinfo(ai.ai_addr, ai.ai_addrlen, buf, sizeof buf, 0, 0, 0) < 0) goto error;

Единственный раз, когда я могу подумать, когда вам могут понадобиться какие-либо структуры типа sockaddr, - это использование getpeername или getsockname в сокете или recvfrom.Здесь вы должны использовать sockaddr_storage, если вы не знаете семейство адресов априори.

Я даю этот совет по 3 причинам:

  1. Намного проще выполнить все ваши строки-адреса с обратным адресом и обратно с помощью этих двух функций, чем запись всех случаев (для обработки сбоев поиска и попытки анализа адреса как ip и т. д.) по отдельности.
  2. Кодирование таким способом упрощает поддержкуПротоколы IPv6 (и, возможно, другие, отличные от IPv4).
  3. Старые функции gethostbyname и gethostbyaddr были фактически удалены из последней версии POSIX, потому что они считались настолько устаревшими / устаревшими / сломанными.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...