c - 为什么 getaddrinfo() 总是导致分段错误?
问题描述
#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
.0x1
问题是buff
andport
字符串中有一个换行符 ( \n
)。
当换行符被剥离时,它会运行到完成。
这是我使用的修改后的代码:
#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);
}
推荐阅读
- ruby-on-rails - ActiveStorage 直接上传在 Staging 中有错误的请求 URL,但在 dev 中没有:https://xxxxxx/rails/active_storage/direct_uploads
- java - Autowired 在测试中返回 null
- reporting-services - 使用 LookUp 函数在 SSRS 报告中出现错误
- android - 即使在活动完成后仍要跟踪活动的最佳做法是什么?
- windows-10 - cv2.imshow 错误“功能未实现”
- c# - 如何在一堆 ISet 上调用 Count
T 变化的性质 - openssl - 如何将 ed25519 私钥导入 Yubi HSM 2
- java - '+'字符串连接在java中是如何实现的
- ios - 手动抛出 CKErrorPartialFailure
- sql - 嵌套 CASE 语句中的不可预测的行为