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结构体未初始化,残留的垃圾值可能引发未知异常。
修复方案
快速修复现有代码
- 取消
socket_address的memset注释,初始化结构体:
memset(&socket_address, 0, sizeof(socket_address));
- 修正
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"); }
- 修正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的返回结果即可,避免手动转换出错:
- 调用
getaddrinfo时直接指定端口为80:
int addrErr = getaddrinfo(domain, "80", &getResult, &getResult2);
- 省略手动构建
socket_address的所有代码,直接用返回的地址调用connect:
int connectStatus = connect(sock, getResult2->ai_addr, getResult2->ai_addrlen);
内容的提问来源于stack exchange,提问作者logsInMyEyes69
相关产品推荐
相关产品推荐

