为什么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()由于分段错误而终止程序。 编辑:在检查为什么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(),输入仅为
(还测试了许多其他地址)
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);
}