商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 如何在Linux上用C++处理网络请求

如何在Linux上用C++处理网络请求

  发布于2026-07-16 阅读(0)

扫一扫,手机访问

在 Linux 环境下用 C++ 写网络请求,其实有不少路子可以走。主流的三个方向是:libcurlBoost.Asio,以及直接撸 socket 系统调用。下面分别展开说说,每种方法都附上代码示例,方便直接上手。

如何在Linux上用C++处理网络请求

使用 libcurl

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.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_systemlibpthread

g++ -o http_request http_request.cpp -lboost_system -lpthread
./http_request

使用 socket API

如果想要更底层、更直接的掌控感,直接上 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 灵活,按需取用即可。

本文转载于:https://www.yisu.com/ask/52336132.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注