2013-07-06 1 views
1

Я использовал функцию winapi inet_ntoa для преобразования беззнакового длинного десятичного числа в ip-адрес. Я получаю ip-адрес в обратном порядке. Я использовал веб-сайт http://www.allredroster.com/iptodec.htm, чтобы получить десятичный эквивалент ввода ip адрес.decimal на ip-адрес

for ex decimal equivalent of 206.117.16.66 is 3463778370 

и если я использую функцию inet_ntoa вернуть внутрибрюшинно его дающую внутрибрюшинно, как 66.16.117.206 .Below код для того же, пожалуйста, дайте мне знать правильный способ сделать это.

#include<stdio.h> 
    #include<WinSock2.h> 
    #pragma comment(lib, "Ws2_32.lib") 

    int main() 
    { 

     ULONG ipdec=0; 
     struct in_addr ipadr; 
     char ip[50]; 
     printf("\n Enter the ip address in decimal equivalent of ip address : "); 
     scanf_s("%ld",&ipdec); 
    ipadr.S_un.S_addr=ipdec; 
     strcpy_s(ip,inet_ntoa(ipadr)); 
    printf("\n The ip address in dotted format is : %s \n" ,ip); 

    } 

ответ

4

inet_ntoa определяется как принимать входные данные в сетевом порядке байтов. Вы предоставляете входные данные в порядке байтов хоста, который на системах x86 отстает (немного по сравнению с большим endian). Сначала необходимо передать десятичный адрес через htonl.

+0

Блестящий ответ от каждого из вас, спасибо за очищение концепции. + 1 upvote для каждого. Спасибо. –

3
206 = 11001110 
117 = 01110101 
16 = 00010000 
66 = 01000010 



(11001110 01110101 00010000 01000010) = 3463778370 

Преобразование в двоичное. Но они вместе конвертируются в десятичный.

+1

@jayaram: я знаю преобразование из десятичного в ip и наоборот, но хотел знать функцию winapi, которая делает правильное преобразование. –

2

Использовать htonl (означает, что хост сети длиннее), чтобы конвертировать IP-адрес из числа байтов хоста в сетевой порядок байтов. Он работает как для мало-endian, так и для больших машин.

ULONG ipnet = htol(ipdec)