[C] Преобразование десятичного IP-адреса в десятичную запись с точками - PullRequest
1 голос
/ 17 ноября 2011

Я получил следующий десятичный IP: «3232235876», он представляет «192.168.1.100»

Я получил его следующим образом:

   //GET IP
        if (gethostname(hostname, sizeof(hostname)) == SOCKET_ERROR) {
            printf("%s","host not found");
        }

        struct hostent *phe = gethostbyname(hostname);
        memcpy(&addr, phe->h_addr_list[0], sizeof(struct in_addr));

        //Convert IP to Decimal notation
        sprintf(decResult,"%u", addr);
        sprintf(decResult,"%u", htonl(atoi(decResult))); 

But now is my question how do I reconvert it to the Dotted Decimal Notation?

Я знаю, что это сделано с 'inet_ntoa'function, но мне сначала нужно преобразовать' 3232235876 'в другое, а затем мне нужно преобразовать это в addr.

На оба этих вопроса я не знаю ответа: /

ВидС уважением.

1 Ответ

4 голосов
/ 17 ноября 2011

Используйте inet_ntoa для преобразования адреса в строку:

if (gethostname(hostname, sizeof(hostname)) == -1) {
    printf("host not found");
    return;
}

struct hostent *phe = gethostbyname(hostname);
if (phe == NULL) {
    printf("Could resolve %s!", hostname);
    return;
}

struct in_addr **addr_list = (struct in_addr **)phe->h_addr_list;
char *addr_str = inet_ntoa(*addr_list[0]);

Вы также можете перебрать список адресов следующим образом:

for (int i = 0; addr_list[i] != NULL; i++) {
    printf("%s ", inet_ntoa(*addr_list[i]));
}

См. Пример кода в этой справочной странице gethostbyname . Обратите внимание, что gethostbyname устарела, поскольку не работает с IPv6. Вы должны использовать getaddrinfo вместо этого. И снова см. Справочную страницу, например, код .

...