C语言Socket连接HTTP服务失败返回退出值255问题求助
代码问题排查与修复
核心错误
你代码里定义的连接端口是8000,而Google公网的HTTP服务默认监听80端口,目标端口不匹配是连接超时、最终失败的直接原因。
其他可优化/修复点
- 缺少
gethostbyname返回值校验:如果域名解析失败,hostinfo会返回空指针,后续访问hostinfo->h_addr_list[0]会触发段错误,程序异常退出。 gethostbyname属于已废弃的POSIX API,推荐改用getaddrinfo替代,兼容性更强,同时支持IPv4、IPv6地址解析。send、read调用未校验返回值,无法判断请求发送、响应读取是否成功。- HTTP/1.1协议默认开启长连接,服务端不会在单次响应发送完成后主动断开连接,
read调用可能会卡住,你可以改用HTTP/1.0协议,或者在请求头里加Connection: close明确要求短连接。
修复后的参考代码
#include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netdb.h> #include <stdlib.h> #include <unistd.h> #include <string.h> // 端口改为HTTP默认的80 #define PORT 80 int main(void) { int sock = 0, valread; struct sockaddr_in serv_addr; char *hostname = "www.google.com"; // 请求头加Connection: close避免长连接卡住 char *request = "GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n"; struct hostent *hostinfo = gethostbyname(hostname); // 新增域名解析失败校验 if (hostinfo == NULL) { printf("Domain name resolution failed\n"); return -1; } char *ip = inet_ntoa(*(struct in_addr*)hostinfo->h_addr_list[0]); char buffer[1024] = {0}; printf("Creating socket...\n"); if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0){ printf("\n Socket creation error \n"); return -1; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); printf("Checking address...\n"); if(inet_pton(AF_INET, ip, &serv_addr.sin_addr) <= 0){ printf("\n Invalid IP/Address not supported \n"); return -1; } printf("Connecting to host %s...\n", ip); if(connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0){ perror("Connect error"); printf("\n Connection Failed \n"); return -1; } // 校验send返回值 ssize_t send_len = send(sock, request, strlen(request), 0); if (send_len < 0) { printf("Send request failed\n"); close(sock); return -1; } printf("Message sent\n"); // 循环读取完整响应 while((valread = read(sock, buffer, sizeof(buffer)-1)) > 0) { buffer[valread] = '\0'; printf("%s", buffer); } close(sock); return 0; }
内容的提问来源于stack exchange,提问作者JuanR4140
相关产品推荐
相关产品推荐

