news 2026/6/26 16:12:15

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 16:09:43

如何实现微信聊天记录永久保存:WeChatMsg本地数据备份完整指南

如何实现微信聊天记录永久保存:WeChatMsg本地数据备份完整指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/…

作者头像 李华
网站建设 2026/6/26 16:09:31

P1Browser这次更新有点东西

p1更新日志 🟢本次更新亮点: 1️⃣复制窗口功能 已有环境可以快速复制,创建相似配置时不用重新设置。 2️⃣批量转移功能 多个环境可统一调整归属,团队整理和交接更方便。 3️⃣一键新环境 减少创建步骤,新建环境更直接…

作者头像 李华
网站建设 2026/6/26 16:09:10

终极指南:在Mac上免费实现NTFS硬盘读写完整解决方案

终极指南:在Mac上免费实现NTFS硬盘读写完整解决方案 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and management for …

作者头像 李华
网站建设 2026/6/26 16:03:57

Claude Code 教程 -01-快速上手

Lison <dreamlison163.com>, v1.0.0, 2026.06.21 Claude Code -01-快速上手 文章目录Claude Code -01-快速上手安装与配置环境要求安装Claude Code配置API Key启动与基本操作启动方式首次启动配置基本界面Claude Code 的多种使用形态JetBrains IDEsVSCode扩展启动Claude…

作者头像 李华