c - inet_ntop 导致段错误

标签 c segmentation-fault getaddrinfo inet-ntop

我有问题。我有代码需要将域名转换为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:我试图尽可能简化我的代码。这就是它没有产生任何有用结果的原因)

最佳答案

… give seg fault. But why it give it?

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;

关于c - inet_ntop 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58272778/

相关文章:

c - OR 运算时段错误

c - 在 C 中使用函数指针数组时出现段错误

c - 多线程初始化中的Unknown Segmentation Fault (Core Dumped)

c++ getaddrinfo 不处理大 curl

c - 接受多个 UDP 连接的套接字控件

c++ - 使用 gcc -lncurses 标志编译 ncurses 代码似乎不起作用

c - 是否有 getifaddrs() 结果更改时的通知机制?

c - 对 `printf' 的 undefined reference

c - 如何使用正确的参数在 C 中调用 execl()?

whois - getaddrinfo(whois.verisign-grs.com) : Name or service not known