2012-03-11 15 views
1

これは単純なプログラムで、ドメインA recordのすべてを調べるために書きます。Linuxネットワークプログラミング:getaddrinfo()間違った結果を得る

私はそれを遵守し、エラーも警告も表示されません。

./a.out www.google.com

2.0.0.0

2.0.0.0

は、その後、私はそれを実行して、私は唯一のような、それは間違ったIPを与えましたこれは私のコードです:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <netdb.h> 

int main(int argc, char *argv[]) 
{ 
    struct addrinfo addrC; 
    struct addrinfo *addrL; 
    struct addrinfo *temp; 

    memset(&addrC, 0, sizeof(addrC)); 
    addrC.ai_family = AF_INET; 
    addrC.ai_socktype = SOCK_STREAM; 
    addrC.ai_protocol = IPPROTO_TCP; 

    if (getaddrinfo(argv[1], "http", &addrC, &addrL) != 0) 
    { 
     perror("getaddrinfo!"); 
     exit(1); 
    } 

    for (temp = addrL; temp != NULL; temp = temp->ai_next) 
    { 
     char addrBuf[BUFSIZ]; 
     void *addrCount = &((struct sockaddr_in*)temp)->sin_addr; 
     inet_ntop(temp->ai_addr->sa_family, addrCount, addrBuf, sizeof(addrBuf)); 
     printf("%s\n", addrBuf); 
    } 
    for (temp = addrL; temp != NULL; temp = addrL) 
    { 
     addrL = temp->ai_next; 
     free(temp); 
    } 
    return 0; 
} 

なぜですか?それを修正する方法は?

+0

'struct addrinfo'は' struct sockaddr_in'ではなく、それらの間のキャストはガーベジを生成する可能性があります。代わりに 'temp-> ai_addr'を使うことができます。これは' sockadr_in'です。 (なぜあなたは結果を 'addrCount'という名前にしていますか?それはアドレスであることを意味し、何のカウントでもありません)。 –

答えて

1

あなたがループ内でポインタのキャストでのエラーを持って、それは次のようになります。

void *addrCount = &((struct sockaddr_in*)temp->ai_addr)->sin_addr; 

そうでなければ、あなたがゴミを読んで、inet_ntopにそのゴミを渡している、あなたは結果としてゴミを得るよう:)

1

他の回答は正しいですが、inet_ntopの代わりにgetnameinfo(NI_NUMERICHOSTを使用)を使用することをおすすめします。それで、最初にこのエラーが起きなかったでしょう。

また、ループして結果をgetaddrinfoから解放するはずもありません。配列全体を解放するには、freeaddrinfoに電話してください。

+0

+1はgetnameinfoとそれ以外はすべて。 – glglgl