为什么getaddrinfo()总是导致分段错误? #包括 #包括 #包括 int main(){ 字符buff[50]; 字符端口[5]; printf(“输入要查找的地址:”); fgets(浅黄色,50,标准尺寸); printf(“输入端口:”); fgets(端口5,标准输入); 结构addrinfo*res; struct addrinfo hints;memset(&hints,0,sizeof(hints));hints.ai_flags=ai_PASSIVE; __自动类型错误=getaddrinfo(buff、port、提示和res); 如果(错误ai_addr,res->ai_addrlen,buff,50,0,0); 如果(错误ai_addr,res->ai_addrlen,buff,50,0,0,NI_numericost); printf(“主机IP:%s\n”,buff); freeaddrinfo(res); } 您的输入是什么?对于初学者,添加错误检查代码。检查所有函数的返回值-在不知道是否包含有效指针的情况下,不应盲目取消引用res。不要盲目地假设buff包含一个有效的字符串,而不检查函数返回值。@kaylum我的输入只是www.google.com和端口443。我知道错误检查,但这段代码非常简单,它应该可以正常工作,但有些地方不正确。你的问题是你正在将&res传递给getaddrinfo。但是,res是一个统一的指针。Try:struct addrinfo res(即没有*)。如果您这样做,请将所有res->更改为res.@CraigEstey实际上getaddinfo()应该根据文档“it's should to work”分配结构并将指针分配给res。显然不是。只需添加错误检查。所有好的代码都需要它,它将帮助您调试可能存在的任何问题。你不能只说“它应该工作”,而不进行基本的调试,如错误检查、调试打印、在调试器中运行等。所以整个问题是getaddrinfo无法处理“\n”字符,这似乎有点奇怪(对:)。@Khaledgeaber它可能在保护自身方面做得更好。但是,getaddrinfo在速度方面不是“面向人类的”(即,它假设其输入已经被检查过)。 #include <string.h> #include <stdio.h> #include <unistd.h> #include <netdb.h> void fixup(char *buf) { char *cp; cp = strchr(buf,'\n'); if (cp != NULL) *cp = 0; } int main() { char buff[50]; char port[5]; #if 1 FILE *xf = stdin; #else FILE *xf = fopen("input.txt","r"); #endif printf("Enter address to lookup: "); fgets(buff, 50, xf); fixup(buff); printf("Enter Port: "); fgets(port, 5, xf); fixup(port); struct addrinfo *res; struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_ALL; getaddrinfo(buff, port, &hints, &res); printf("res=%p\n",res); printf("Host IP: %s\n", buff); getnameinfo(res->ai_addr, res->ai_addrlen, buff, 50, 0, 0, NI_NUMERICHOST); printf("Host IP: %s\n", buff); freeaddrinfo(res); }

为什么getaddrinfo()总是导致分段错误? #包括 #包括 #包括 int main(){ 字符buff[50]; 字符端口[5]; printf(“输入要查找的地址:”); fgets(浅黄色,50,标准尺寸); printf(“输入端口:”); fgets(端口5,标准输入); 结构addrinfo*res; struct addrinfo hints;memset(&hints,0,sizeof(hints));hints.ai_flags=ai_PASSIVE; __自动类型错误=getaddrinfo(buff、port、提示和res); 如果(错误ai_addr,res->ai_addrlen,buff,50,0,0); 如果(错误ai_addr,res->ai_addrlen,buff,50,0,0,NI_numericost); printf(“主机IP:%s\n”,buff); freeaddrinfo(res); } 您的输入是什么?对于初学者,添加错误检查代码。检查所有函数的返回值-在不知道是否包含有效指针的情况下,不应盲目取消引用res。不要盲目地假设buff包含一个有效的字符串,而不检查函数返回值。@kaylum我的输入只是www.google.com和端口443。我知道错误检查,但这段代码非常简单,它应该可以正常工作,但有些地方不正确。你的问题是你正在将&res传递给getaddrinfo。但是,res是一个统一的指针。Try:struct addrinfo res(即没有*)。如果您这样做,请将所有res->更改为res.@CraigEstey实际上getaddinfo()应该根据文档“it's should to work”分配结构并将指针分配给res。显然不是。只需添加错误检查。所有好的代码都需要它,它将帮助您调试可能存在的任何问题。你不能只说“它应该工作”,而不进行基本的调试,如错误检查、调试打印、在调试器中运行等。所以整个问题是getaddrinfo无法处理“\n”字符,这似乎有点奇怪(对:)。@Khaledgeaber它可能在保护自身方面做得更好。但是,getaddrinfo在速度方面不是“面向人类的”(即,它假设其输入已经被检查过)。 #include <string.h> #include <stdio.h> #include <unistd.h> #include <netdb.h> void fixup(char *buf) { char *cp; cp = strchr(buf,'\n'); if (cp != NULL) *cp = 0; } int main() { char buff[50]; char port[5]; #if 1 FILE *xf = stdin; #else FILE *xf = fopen("input.txt","r"); #endif printf("Enter address to lookup: "); fgets(buff, 50, xf); fixup(buff); printf("Enter Port: "); fgets(port, 5, xf); fixup(port); struct addrinfo *res; struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_ALL; getaddrinfo(buff, port, &hints, &res); printf("res=%p\n",res); printf("Host IP: %s\n", buff); getnameinfo(res->ai_addr, res->ai_addrlen, buff, 50, 0, 0, NI_NUMERICHOST); printf("Host IP: %s\n", buff); freeaddrinfo(res); },c,networking,segmentation-fault,getaddrinfo,getnameinfo,C,Networking,Segmentation Fault,Getaddrinfo,Getnameinfo,运行此代码会导致getaddrinfo()由于分段错误而终止程序。 编辑:在检查getaddrinfo的返回值后,错误似乎来自getaddrinfo(),输入仅为 (还测试了许多其他地址) 443(也使用端口80进行了尝试)当我运行原始代码时,我得到res值0x1 问题是buff和port字符串中有一个换行符(\n) 当新行被剥离时,它运行到完成 以下是我使用的修改代码: #include <string.h> #include <stdio.h> #include &l

运行此代码会导致getaddrinfo()由于分段错误而终止程序。 编辑:在检查
getaddrinfo
的返回值后,错误似乎来自getaddrinfo(),输入仅为 (还测试了许多其他地址)
443(也使用端口80进行了尝试)

当我运行原始代码时,我得到
res
0x1

问题是
buff
port
字符串中有一个换行符(
\n

当新行被剥离时,它运行到完成

以下是我使用的修改代码:

#include <string.h>
#include <stdio.h>
#include <netdb.h>

int main(){
    char buff[50];
    char port[5];

    printf("Enter address to lookup: ");
    fgets(buff, 50, stdin);

    printf("Enter Port: ");
    fgets(port, 5, stdin);

    struct addrinfo* res;
    struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_flags= AI_PASSIVE;

    __auto_type error = getaddrinfo(buff, port, &hints, &res);
    if (error < 0 )
        return 4;

    printf("Host IP: %s", buff);
    error = getnameinfo(res->ai_addr, res->ai_addrlen, buff, 50, 0, 0, 0);
    if (error < 0)
        return 5;

    printf("Host IP: %s", buff);
    freeaddrinfo(res);
}
#包括
#包括
#包括
#包括
无效的
修正(字符*buf)
{
char*cp;
cp=strchr(buf,'\n');
如果(cp!=NULL)
*cp=0;
}
int
main()
{
字符buff[50];
字符端口[5];
#如果1
文件*xf=stdin;
#否则
文件*xf=fopen(“input.txt”,“r”);
#恩迪夫
printf(“输入要查找的地址:”);
fgets(buff,50,xf);
修正(buff);
printf(“输入端口:”);
fgets(端口5,xf);
固定(港口);
结构addrinfo*res;
结构addrinfo提示;
memset(&hints,0,sizeof(hints));
hits.ai_flags=ai_ALL;
getaddrinfo(buff、port、提示和res);
printf(“res=%p\n”,res);
printf(“主机IP:%s\n”,buff);
getnameinfo(res->ai_addr,res->ai_addrlen,buff,50,0,0,NI_numericost);
printf(“主机IP:%s\n”,buff);
freeaddrinfo(res);
}

您的输入是什么?对于初学者,添加错误检查代码。检查所有函数的返回值-在不知道是否包含有效指针的情况下,不应盲目取消引用
res
。不要盲目地假设
buff
包含一个有效的字符串,而不检查函数返回值。@kaylum我的输入只是www.google.com和端口443。我知道错误检查,但这段代码非常简单,它应该可以正常工作,但有些地方不正确。你的问题是你正在将
&res
传递给
getaddrinfo
。但是,
res
是一个统一的指针。Try:
struct addrinfo res(即没有
*
)。如果您这样做,请将所有
res->
更改为
res.
@CraigEstey实际上getaddinfo()应该根据文档“it's should to work”分配结构并将指针分配给res。显然不是。只需添加错误检查。所有好的代码都需要它,它将帮助您调试可能存在的任何问题。你不能只说“它应该工作”,而不进行基本的调试,如错误检查、调试打印、在调试器中运行等。所以整个问题是getaddrinfo无法处理“\n”字符,这似乎有点奇怪(对:)。@Khaledgeaber它可能在保护自身方面做得更好。但是,
getaddrinfo
在速度方面不是“面向人类的”(即,它假设其输入已经被检查过)。
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <netdb.h>

void
fixup(char *buf)
{
    char *cp;

    cp = strchr(buf,'\n');
    if (cp != NULL)
        *cp = 0;
}

int
main()
{
    char buff[50];
    char port[5];

#if 1
    FILE *xf = stdin;
#else
    FILE *xf = fopen("input.txt","r");
#endif

    printf("Enter address to lookup: ");
    fgets(buff, 50, xf);
    fixup(buff);

    printf("Enter Port: ");
    fgets(port, 5, xf);
    fixup(port);

    struct addrinfo *res;
    struct addrinfo hints;

    memset(&hints, 0, sizeof(hints));
    hints.ai_flags = AI_ALL;

    getaddrinfo(buff, port, &hints, &res);
    printf("res=%p\n",res);
    printf("Host IP: %s\n", buff);

    getnameinfo(res->ai_addr, res->ai_addrlen, buff, 50, 0, 0, NI_NUMERICHOST);
    printf("Host IP: %s\n", buff);

    freeaddrinfo(res);
}