gpt4 book ai didi

c - getaddrinfo() 返回 2.0.0.0

转载 作者:行者123 更新时间:2023-11-30 17:43:53 24 4
gpt4 key购买 nike

我正在尝试查找主机名的 IP 地址,即 www.google.com

我调用 getaddrinfo() 扫描列表,创建一个原始 ipv4 icmp 套接字,然后将该套接字绑定(bind)到该地址

当我检查在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;

最佳答案

您的代码中似乎存在一些错误:

  • addrptr=list->ai_next应该是addrptr=addr->ai_next遍历列表。
  • 在 while 循环之后,addrptr->ai_addr保存最后找到的条目,而不是 list->ai_addr .
  • bind() 成功时返回零,因此您应该检查 if(bind(...) == 0) break;
  • 除非我弄错了,bind()用于将套接字绑定(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;
}

输出为:“可通过 173.194.113.146 访问 www.google.com”

更新:您复制找到的地址的代码是错误的,应该是

struct sockaddr_in dstaddr;
memcpy(&dstaddr, addrptr->ai_addr, sizeof(dstaddr));
dstaddr.sin_port = 0;

关于c - getaddrinfo() 返回 2.0.0.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20163640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com