【发布时间】:2013-11-23 14:39:24
【问题描述】:
我正在尝试查找主机名的 IP 地址,即 www.google.com
我调用 getaddrinfo() 扫描列表,创建一个原始 ipv4 icmp 套接字,然后我将套接字绑定到地址
当我检查在 wireshark 中发送的数据包时,无论我传递给 getaddrinfo() 的主机名是什么,地址都显示为 2.0.0.0
int skt, errno;
struct sockaddr_in addr;
struct addrinfo hints; //prefered addr type(connection)
struct addrinfo * list; //list of addr structs
struct addrinfo * addrptr;//the one i am gonna use
struct in_addr test;
if(servname == NULL){
fprintf(stderr, "No servname!\n");
exit(1);
}
/*
* prefered connection type
*/
bzero(&hints, sizeof(hints));
hints.ai_flags = 0;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_RAW;
hints.ai_protocol = IPPROTO_ICMP;
/*get IP*/
if((errno = getaddrinfo(servname, 0, &hints, &list))<0){
fprintf(stderr, "addrinfo error, lookup fail: %s",
gai_strerror(errno));
exit(1);
}
addrptr=list;
//start scanning
while(addrptr){
//start
if((skt = socket(addrptr->ai_family, addrptr->ai_socktype, addrptr->ai_protocol))<0){
perror("socket()");
exit(1);
}
if(skt > 0)
if(connect(skt,addrptr->ai_addr, addrptr->ai_addrlen)==0)
break;
printf("attempt connect\n");
close (skt);
addrptr=addrptr->ai_next;
}
//once IP has been found set destination address an port=0
dstaddr.sin_addr.s_addr = ((struct in_addr *)addrptr->ai_addr)->s_addr;
dstaddr.sin_port = 0;
【问题讨论】:
-
您是否尝试过使用
gethostbybname()将您的主机名转换为IP 地址?getaddrinfo()在内部使用这个函数。 -
这是我的网络课程中的一项课外作业,他们有点强调使用 getaddrinfo(),因为它是“现代”方法。
-
@Babbleshack 他们是对的。
gethostbyname()不应再使用,至少在新程序中是这样。最好使用getaddrinfo()和getnameinfo();它们涵盖了您可能想要完成的所有事情。 -
好的,所以我认为我正确接收了 IP 地址,但是我将数据 addrptr 复制到 dstaddr 不正确