发布于2026-07-16 阅读(0)
扫一扫,手机访问
在 Linux 环境下用 C++ 写网络请求,其实有不少路子可以走。主流的三个方向是:libcurl、Boost.Asio,以及直接撸 socket 系统调用。下面分别展开说说,每种方法都附上代码示例,方便直接上手。

libcurl 可以说是网络请求库里的老牌明星了,支持 HTTP、HTTPS、FTP 等一大堆协议,封装得相当成熟。
第一步,安装开发包:
sudo apt-get install libcurl4-openssl-dev
然后写一个简单的 GET 请求程序:
#include
#include
size_t callback(const char* in, size_t size, size_t num, std::string* out) {
const size_t totalBytes(size * num);
out->append(in, totalBytes);
return totalBytes;
}
int main() {
CURL* curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
std::string response;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
CURLcode res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
} else {
std::cout << response << std::endl;
}
curl_easy_cleanup(curl);
}
return 0;
}
编译链接时加上 -lcurl:
g++ -o http_request http_request.cpp -lcurl
./http_request
Boost.Asio 是 Boost 库里的网络模块,主打跨平台和低级 I/O 操控,写出来的代码非常优雅,但上手门槛稍高一些。
先安装 Boost 全家桶:
sudo apt-get install libboost-all-dev
接下来是一个基于 Boost.Asio 的 HTTP GET 请求示例:
#include
#include
#include
#include
using boost::asio::ip::tcp;
class HttpClient {
public:
HttpClient(boost::asio::io_service& io_service, const std::string& host, const std::string& service)
: resolver_(io_service), socket_(io_service) {
tcp::resolver::query query(host, service);
endpoint_iterator endpoints = resolver_.resolve(query);
boost::asio::connect(socket_, endpoints);
}
void sendRequest(const std::string& request) {
boost::asio::write(socket_, boost::asio::buffer(request));
}
std::string receiveResponse() {
boost::asio::streambuf response;
boost::asio::read_until(socket_, response, "\r\n");
std::istream response_stream(&response);
std::string http_version;
response_stream >> http_version;
unsigned int status_code;
response_stream >> status_code;
std::string status_message;
std::getline(response_stream, status_message);
if (!response_stream || http_version.substr(0, 5) != "HTTP/") {
throw std::runtime_error("Invalid response");
}
if (status_code != 200) {
throw std::runtime_error("Response returned with status code " + std::to_string(status_code));
}
boost::asio::read_until(socket_, response, "\r\n\r\n");
return std::string(boost::asio::buffer_cast(response.data()), response.size());
}
private:
tcp::resolver resolver_;
tcp::socket socket_;
};
int main() {
try {
boost::asio::io_service io_service;
HttpClient client(io_service, "www.example.com", "http");
std::string request = "GET / HTTP/1.1\r\n";
request += "Host: www.example.com\r\n";
request += "Accept: */*\r\n";
request += "Connection: close\r\n\r\n";
client.sendRequest(request);
std::string response = client.receiveResponse();
std::cout << response << std::endl;
} catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << std::endl;
}
return 0;
}
编译时要链接 libboost_system 和 libpthread:
g++ -o http_request http_request.cpp -lboost_system -lpthread
./http_request
如果想要更底层、更直接的掌控感,直接上 Linux 的 socket API 是最硬核的选择。所有细节都暴露在眼前,适合练手或者对性能有极致要求的场景。
下面是一个用原始 socket 发送 HTTP GET 请求的例子:
#include
#include
#include
#include
#include
#include
int main() {
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
std::cerr << "Could not create socket" << std::endl;
return -1;
}
sockaddr_in server;
server.sin_addr.s_addr = inet_addr("93.184.216.34"); // example.com IP
server.sin_family = AF_INET;
server.sin_port = htons(80);
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0) {
std::cerr << "Connect failed" << std::endl;
return -1;
}
std::string request = "GET / HTTP/1.1\r\n";
request += "Host: www.example.com\r\n";
request += "Accept: */*\r\n";
request += "Connection: close\r\n\r\n";
if (send(sock, request.c_str(), request.size(), 0) < 0) {
std::cerr << "Send failed" << std::endl;
return -1;
}
char buffer[4096];
while (recv(sock, buffer, sizeof(buffer), 0) > 0) {
std::cout.write(buffer, sizeof(buffer));
}
close(sock);
return 0;
}
编译直接无额外依赖:
g++ -o http_request http_request.cpp
./http_request
以上是三种常见的网络请求处理方式,算是一份基础入门指南。实际项目里,还需要考虑错误处理、超时设置、SSL/TLS 加密等细节,选哪个库就看具体场景和需求了。每种方法都有各自的优缺点,libcurl 省心,Boost.Asio 优雅,socket API 灵活,按需取用即可。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8