我有问题。我有代码,我需要将域名转换为IP。为此,我使用函数getaddrinfo()。但是,当我调用另一个函数(在getaddrinfo()之后),我的程序似乎会失败(生成getaddrinfo返回错误和分段错误)。我发现,问题在于调用getaddrinfo()之后调用函数inet_ntop()。但我不知道为什么会发生这种奇怪的行为。这是我的代码:
#include<stdio.h> //scanf , printf
#include<string.h> //strtok
#include<stdlib.h> //realloc
#include<sys/socket.h> //socket
#include<netinet/in.h> //sockaddr_in
#include<arpa/inet.h> //getsockname
#include<netdb.h> //hostent
#include<unistd.h> //close
#include <getopt.h> //getopt
#define DEFAULT_SOCKET_PROTOCOL 0
#define SERVER_PORT 43
#define IPv4_MAX_LENGTH 16
#define IPv6_MAX_LENGTH 40
#define DOMAIN_NAME_MAX_LENGTH 254
#define MAX_ADDRES_COUNT 3
typedef struct argument{
char address[DOMAIN_NAME_MAX_LENGTH];
char IPv4[IPv4_MAX_LENGTH];
char IPv6[IPv6_MAX_LENGTH];
int address_family;
struct argument *next;
} Argument;
int addres_to_ip(char * hostname , char* ip);
int get_IP_addresses(Argument **args);
int main(int argc , char *argv[])
{
Argument *args = NULL;
args = malloc(sizeof(Argument));
strcpy(args->address, "google.com");
get_IP_addresses(&args);
return 0;
}
int get_IP_addresses(Argument **args){
char addrstr[DOMAIN_NAME_MAX_LENGTH];
char tmp_ip[DOMAIN_NAME_MAX_LENGTH];
strcpy(tmp_ip, (*args)->address);
struct addrinfo tmp_ai, *new_ai;
tmp_ai.ai_flags = AI_CANONNAME;
tmp_ai.ai_family = AF_INET;
tmp_ai.ai_socktype = SOCK_STREAM;
printf("a\n");
if(getaddrinfo (tmp_ip, NULL, &tmp_ai, &new_ai) != 0){
printf("CHYBA: gettaddrinfo()\n");
}
while (new_ai)
{
inet_ntop (AF_INET, new_ai->ai_addr->sa_data, addrstr, DOMAIN_NAME_MAX_LENGTH);
new_ai = new_ai->ai_next;
}
return 0;
}如果你把
inet_ntop (AF_INET,new_ai->ai_addr->sa_data,addrstr,DOMAIN_NAME_MAX_LENGTH);
它不会给塞格带来过错。但它为什么要给它??帮帮忙,谢谢!
(PS:我尽量简化我的代码。)这是为什么它没有产生任何有用的结果)
发布于 2019-10-08 11:57:45
…给塞格一个错误。但它为什么要给它?
getaddrinfo(…, &new_ai)返回时出错,在这种情况下,您可能不依赖于正在设置的new_ai。
错误返回的原因是您忘记初始化tmp_ai.ai_protocol。如果在tmp_ai的定义中使用初始化器,则不会发生这种情况。
struct addrinfo tmp_ai = { .ai_flags = AI_CANONNAME,
.ai_family = AF_INET,
.ai_socktype = SOCK_STREAM }, *new_ai;https://stackoverflow.com/questions/58272778
复制相似问题