这是一个简单的程序,我写它是为了找出一个域的所有A record
。
我把它复杂化了,没有错误,也没有警告。
然后我运行它,我只发现它给出了错误的IP,例如:
./a.out www.google.com
2.0.0.0
2.0.0.0
这是我的密码:
#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;
}
为什么?如何纠正呢?
发布于 2012-03-11 07:50:11
在循环内的指针转换中有一个错误,它应该是:
void *addrCount = &((struct sockaddr_in*)temp->ai_addr)->sin_addr;
否则,您将读取垃圾并将该垃圾传递给inet_ntop
,因此您将得到垃圾:)
发布于 2012-03-11 10:48:36
另一个答案是正确的,但我建议使用getnameinfo
(使用NI_NUMERICHOST)而不是inet_ntop
。这样你就不会有这个错误了。
另外,不应该循环并将结果从getaddrinfo
中释放出来。调用freeaddrinfo
来释放整个数组。
https://stackoverflow.com/questions/9653080
复制相似问题