讲师中心 微信公众号
AI工具推荐 视频效率加速

c++中如何实现简单的HTTP请求_c++使用socket发送GET请求方法【详解】

浅雪姑娘_6324

浅雪姑娘_6324

发布时间:2026-01-19 16:53:11

|

661人浏览过

|

来源于php中文网

原创

标准C++无内置HTTP支持,std::socket非标准库组件;推荐用libcurl实现GET请求,它封装DNS、TLS、重定向等细节,跨平台且API简洁。

c++中如何实现简单的http请求_c++使用socket发送get请求方法【详解】

直接用 std::socket 发 GET 请求行不通

标准 C++ 没有内置 HTTP 客户端支持,std::socket 也不是标准库组件(C++20 前无 <networking>,且已被搁置)。你看到的“用 C++ socket 发 GET”实际依赖操作系统原生 socket API(socket()、connect()、send()、recv()),必须手动构造 HTTP 报文、处理 DNS 解析、管理 TCP 连接、应对重定向和 TLS —— 这不是“简单实现”,而是重写 mini curl。

最轻量但靠谱的做法:用 libcurl 的 curl_easy_perform

它封装了所有底层细节,跨平台,支持 HTTPS(需链接 OpenSSL 或 BearSSL),且 API 极简。不用自己解析响应头或处理 chunked 编码。

  • Linux/macOS:用包管理器安装 libcurl4-openssl-dev 或 curl 开发包
  • Windows:用 vcpkg vcpkg install curl,或直接下载预编译库
  • 编译时加 -lcurl(GCC/Clang)或链接 libcurl.lib(MSVC)
extern "C" {
#include <curl/curl.h>
}
#include <iostream>
<p>size_t write_callback(void<em> ptr, size_t size, size_t nmemb, void</em> userp) {
std::string<em> response = static_cast<std::string</em>>(userp);
size_t len = size <em> nmemb;
response->append(static_cast<char</em>>(ptr), len);
return len;
}</p><p>int main() {
CURL* curl = curl_easy_init();
if (!curl) return -1;</p><pre class='brush:php;toolbar:false;'>std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://httpbin.org/get");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); // 自动跳转
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);

CURLcode res = curl_easy_perform(curl);
if (res == CURLE_OK) {
    std::cout << response << "\n";
} else {
    std::cerr << "curl error: " << curl_easy_strerror(res) << "\n";
}

curl_easy_cleanup(curl);
return 0;

}

如果坚持手写 socket:只适用于 HTTP + 无重定向 + 无 TLS 的极简场景

仅建议用于教学、嵌入式受限环境,或调试网络协议。关键点不是“怎么连”,而是“怎么不崩”:

立即学习“C++免费学习笔记(深入)”;

Windows-Android_SSH_Remote_Control
Windows-Android_SSH_Remote_Control

通过 SSH 隧道从 Android 设备在互联网上对 Windows PC 实现完整远程控制的设置与使用指南,适用于远程桌面访问、安全 RDP 等。

下载
  • DNS 解析必须调 getaddrinfo(),不能硬写 IP(域名可能变,IPv6 需兼容)
  • HTTP 请求行末尾必须是 "\r\n",Header 之间用 "\r\n",空行必须是 "\r\n\r\n"(少一个 \r,服务端就卡住)
  • recv() 是流式读取,不能假设一次读完;需循环 + 检查返回值,或按 Content-Length 截断
  • 忽略 Connection: close 或未关闭 socket 会导致端口耗尽

错误现象常见:recv() 返回 0(对端已关闭)、返回 -1(errno=ETIMEDOUT 或 ECONNREFUSED)、响应体截断、中文乱码(没处理 Content-Type: charset=utf-8)。

别碰裸 socket 处理 HTTPS

HTTPS 不是“把 http:// 换成 https:// 再连 443 端口”。它需要:

  • TLS 握手(ClientHello / ServerHello / 密钥交换)
  • 证书验证(否则中间人攻击白给)
  • 加密/解密载荷(OpenSSL/BoringSSL/mbedTLS 才干这事)

哪怕只验证证书链,代码量也远超 200 行。此时用 libcurl 或 Boost.Beast 是唯一合理选择 —— 后者更现代但依赖 Boost,学习成本略高。

真正容易被忽略的点:HTTP/1.1 默认 keep-alive,但多数简单 socket 示例直接 close(),这没问题;可一旦你并发发起几十个请求,没正确复用连接或设 Connection: close,服务端会主动 RST,导致 recv() 突然返回 -1。

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

3683

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

835

2023.10.30

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

1867

2023.09.19

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3279

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2838

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1508

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2599

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3310

2023.08.08

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

20

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn