当前位置: 首页 > news >正文

【C/C++】用 C 写 HTTP 客户端

目录

  • 用 C 写 HTTP 客户端:为什么 select 还要配合非阻塞 IO

用 C 写 HTTP 客户端:为什么 select 还要配合非阻塞 IO

学习代码:http/http_request.c

HTTP 项目表面上是写一个 GET/POST 客户端,本质上是在练 TCP 客户端的完整流程:域名解析、建立连接、构造请求、发送数据、循环接收响应。和浏览器相比,自己用 C 写一遍会发现,HTTP 文本格式很清楚,但网络 IO 的边界情况一点都不少。

一个最基础的 GET 请求可以这样构造:

snprintf(request,sizeof(request),"GET %s HTTP/1.1\r\n""Host: %s\r\n""User-Agent: SimpleCClient/1.0\r\n""Accept: */*\r\n""Connection: close\r\n""\r\n",path,host);

这里要注意\r\n,HTTP 请求行和请求头都用回车换行结束,头部结束后还要有一个空行。Connection: close的作用是告诉服务器响应完成后关闭连接,这样客户端可以通过recv返回 0 判断对端关闭,简化读取逻辑。

项目里更关键的是select接收模板。刚开始我以为select返回可读之后,recv就一定不会阻塞。后来看笔记才明白:select只能说明“当时看起来可读”,它不是永久保证。多线程抢读、连接异常、协议状态变化,都可能让后续阻塞调用卡住。因此更稳妥的方式是把 fd 设置成非阻塞:

intflags=fcntl(sockfd,F_GETFL,0);fcntl(sockfd,F_SETFL,flags|O_NONBLOCK);

同时,每轮select前都要重新设置fd_settimeval

FD_ZERO(&read_fds);FD_SET(sock,&read_fds);tv.tv_sec=timeout_sec;tv.tv_usec=0;ret=select(sock+1,&read_fds,NULL,NULL,&tv);

这是一个很容易踩的坑。因为select会修改fd_set,有些系统还会把timeval改成剩余时间。如果循环里不重置,后面的判断就可能被污染,出现空转或漏读。

我的理解是,HTTP 客户端练的不只是协议文本,更是“可靠地读完不确定长度的数据”。网络编程里,读到一半、超时、对端关闭、暂时无数据都是正常情况。代码必须把这些状态写清楚,程序才不会在真实网络环境里表现得忽好忽坏。

学习链接: https://github.com/0voice

http://www.jsqmd.com/news/1082401/

相关文章:

  • okbiye AI 写作数据分析:告别 SPSS 复杂操作,一键生成可直接复用的实证研究报告
  • UV Squares:让Blender UV编辑从繁琐到高效的实用插件
  • 如何高效解决Windows运行库缺失问题:VisualCppRedist AIO的实用指南
  • Chatbox AI桌面客户端终极指南:3步轻松部署,开启高效AI对话新体验
  • DataEase配置信息泄露漏洞CVE-2024-30269复现与安全防御解析
  • 大参数模型RL调试不再难:揭秘昇腾“以小验大”精度定位黑科技
  • 【JAVA毕设源码分享】基于SpringBoot的学生学习成果展示平台的设计与实现(程序+文档+代码讲解+一条龙定制)
  • TaleStreamAI:6小时从小说ID到完整视频的AI推文全自动工作流
  • “共享农业新机遇·携手共建经济圈”禾赞科技参与投资促进暨温江巴南交流合作活动
  • 最后80天!2026年9月PMP末班车冲刺攻略:从报名到上岸,一篇管够
  • 强力宽屏改造:让《植物大战僵尸》在现代显示器上重生
  • 如何在浏览器中免费体验Windows 12完整界面:零安装终极指南
  • 3个步骤:IPXWrapper让经典游戏在Windows 10/11重获联机生命
  • WindowResizer终极指南:免费强制调整任意Windows窗口大小
  • 3个技巧让下载效率翻倍:LinkSwift开源工具如何优化你的网盘体验
  • 园区二次供水泵房可视化监控运维管理平台方案
  • Claude Code 教程 -01-快速上手
  • 商用可编辑立体字效合集|电影 / 海报 / LOGO 标题设计神器
  • ComfyUI-Impact-Pack:一站式AI图像智能增强解决方案
  • 自用笔记⑦前端git提交常用前缀
  • Appium+Mitmproxy联动方案:高效采集抖音粉丝数据实战
  • LinkSwift直链解析技术如何突破网盘限速:架构解析与性能验证
  • 3分钟彻底告别Windows激活烦恼:智能激活工具完全指南
  • STM32嵌入式AI实战:手写数字识别优化方案
  • 网盘直链下载助手终极指南:告别限速,一键获取九大网盘高速下载链接
  • 计算机毕业设计之基于微信小程序的洗车服务系统
  • 接口测试全流程实战:从Postman功能测试到JMeter性能压测
  • IPXWrapper终极指南:5分钟让经典游戏在现代Windows上联网对战
  • 1.7 java面试题:Redis 基本篇
  • 告别网盘限速!9大主流网盘直链下载助手终极指南