我正在试图查找主机名的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;发布于 2013-11-23 16:30:36
代码中似乎有一些错误:
addrptr=list->ai_next应该是addrptr=addr->ai_next来遍历列表。addrptr->ai_addr保存最后找到的条目,而不是list->ai_addr。bind()在成功时返回零,所以您应该使用if(bind(...) == 0) break;检查bind()是用来将套接字绑定到本地地址的。若要检查是否可以在某个地址到达主机,请改用connect()。这是我尝试过的代码:
int main(int argc, const char * argv[])
{
int skt, errno;
struct addrinfo hints; //prefered addr type(connection)
struct addrinfo * list; //list of addr structs
struct addrinfo * addrptr;//the one i am gonna use
char *servname = "www.google.com";
memset(&hints, 0, sizeof(hints));
hints.ai_flags = 0;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_RAW;
hints.ai_protocol = IPPROTO_ICMP;
if ((errno = getaddrinfo(servname, 0, &hints, &list))<0){
fprintf(stderr, "addrinfo error, lookup fail: %s", gai_strerror(errno));
exit(1);
}
for (addrptr = list; addrptr != NULL; addrptr = addrptr->ai_next) {
if ((skt = socket(addrptr->ai_family, addrptr->ai_socktype, addrptr->ai_protocol)) == -1)
continue;
if(connect(skt,addrptr->ai_addr, addrptr->ai_addrlen) == 0)
break;
close (skt);
}
if (addrptr != NULL) {
char host[NI_MAXHOST];
getnameinfo(addrptr->ai_addr, addrptr->ai_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
printf("%s can be reached at %s\n", servname, host);
}
return 0;
}输出是:"www.google.com可达173.194.113.146“
更新:复制找到的地址的代码是错误的,它应该是
struct sockaddr_in dstaddr;
memcpy(&dstaddr, addrptr->ai_addr, sizeof(dstaddr));
dstaddr.sin_port = 0;发布于 2019-01-24 00:46:10
为了澄清,这种情况发生在铸造时。
struct sockaddr_in dest;
struct addrinfo* ainfo_arr;
/*getaddrinfo(hostname,NULL,&hints,&ainfo_arr);*/
dest = *( (struct sockaddr_in*) ainfo_arr);
//casting addrinfo to sockaddr_in而不是
struct sockaddr_in dest;
struct addrinfo* ainfo_arr;
/*getaddrinfo(hostname,NULL,&hints,&ainfo_arr);*/
dest = *( (struct sockaddr_in*) ainfo_arr->ai_addr);
//casting sockaddr to sockaddr_in因此,dest中的数据无效。
(可能是AF_PACKET https://stackoverflow.com/a/40254078/6569209)
https://stackoverflow.com/questions/20163640
复制相似问题