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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:18:04