これは単純なプログラムで、ドメイン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;
}
なぜですか?それを修正する方法は?
'struct addrinfo'は' struct sockaddr_in'ではなく、それらの間のキャストはガーベジを生成する可能性があります。代わりに 'temp-> ai_addr'を使うことができます。これは' sockadr_in'です。 (なぜあなたは結果を 'addrCount'という名前にしていますか?それはアドレスであることを意味し、何のカウントでもありません)。 –