【发布时间】:2020-07-16 00:09:41
【问题描述】:
#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);
}
运行此代码导致 getaddrinfo( ) 由于分段错误而终止程序。
编辑:检查getaddrinfo的返回值后,错误似乎来自getaddrinfo(),输入只是
www.google.com(还有一堆其他地址也测试过了)
443(也用80端口试过)
【问题讨论】:
-
您的意见是什么?对于初学者,添加错误检查代码。检查所有函数的返回值 - 不应该在不知道它是否包含有效指针的情况下盲目地取消引用
res。不应盲目假设buff包含有效字符串而不检查函数返回值。 -
@kaylum 我的输入只是带有端口 443 的 www.google.com 我知道错误检查,但是这段代码非常简单,它应该可以正常工作,但有些地方不对。
-
您的问题是您将
&res传递给getaddrinfo。但是,res是一个 unitialized 指针。试试:struct addrinfo res;(即没有*)。而且,如果您这样做,请将所有res->更改为res. -
@CraigEstey 实际上 getaddinfo( ) 应该分配结构并将指针分配给 res 根据文档
-
“它应该可以正常工作”。好吧,显然不是。只需添加错误检查。所有好的代码都需要它,它将帮助您调试可能存在的任何问题。您不能只说“它应该可以工作”而不进行基本调试,例如错误检查、调试打印、在调试器中运行等。
标签: c networking segmentation-fault getaddrinfo getnameinfo