You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言开发网络爬虫时connect函数报Connection refused错误如何解决

问题排查与修复方案

核心错误原因

  • inet_aton传入参数非法。你传入的getResult2->ai_addr->sa_data是通用套接字地址的二进制混合字段,并非点分十进制IP字符串,导致填充到sin_addr的IP地址完全错误,自然无法连接到正确的服务器。
  • inet_aton返回值判断逻辑完全颠倒。inet_aton转换成功返回非0值,失败返回0,你当前代码中转换成功反倒会触发perror退出,完全不符合预期。
  • HTTP请求不规范且发送逻辑错误。HTTP 1.1协议强制要求携带Host头,否则绝大多数服务器会直接返回400错误;同时你调用write时传递的是sizeof(GETrqst),会把缓冲区中后续的空数据也发送给服务器,引发解析错误。
  • sockaddr_in结构体未初始化,残留的垃圾值可能引发未知异常。

修复方案

快速修复现有代码

  1. 取消socket_address的memset注释,初始化结构体:
memset(&socket_address, 0, sizeof(socket_address));
  1. 修正inet_aton的参数和判断逻辑,用你已经转好的netAddr作为输入:
int atonErr = inet_aton(netAddr, &socket_address.sin_addr);
if (atonErr == 0) { // 转换失败才报错
    perror("inet_aton");
    exit(1);
} else {
    printf("successfully converted string to struct\n");
}
  1. 修正HTTP请求构造和发送逻辑:
sprintf(GETrqst, "GET / HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n", domain);
write(sock, GETrqst, strlen(GETrqst)); // 只发送实际请求长度

更简洁的优化方案

完全不需要手动构建sockaddr_in结构体,直接复用getaddrinfo的返回结果即可,避免手动转换出错:

  1. 调用getaddrinfo时直接指定端口为80:
int addrErr = getaddrinfo(domain, "80", &getResult, &getResult2);
  1. 省略手动构建socket_address的所有代码,直接用返回的地址调用connect:
int connectStatus = connect(sock, getResult2->ai_addr, getResult2->ai_addrlen);

内容的提问来源于stack exchange,提问作者logsInMyEyes69

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:54:05