基于 Linux 的轻量级多线程 HTTP 服务

这篇具有很好参考价值的文章主要介绍了基于 Linux 的轻量级多线程 HTTP 服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

      使用基本的Linux系统调用来创建一个TCP socket,监听端口8080,并在接受到客户端连接时创建一个新的线程来处理连接。每个连接处理函数都是一个独立的线程,读取客户端请求并发送固定的HTTP响应。

     代码:

#include <iostream>
#include <string>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>

const int BUFFER_SIZE = 1024;

void *connection_handler(void *socket_desc) {
    int sock = *(int *)socket_desc;
    char buffer[BUFFER_SIZE];
    std::string response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\nHello, World!";

    // 读取客户端请求
    ssize_t read_size = read(sock, buffer, BUFFER_SIZE - 1);
    if (read_size > 0) {
        buffer[read_size] = '\0';
        std::cout << "Received request:\n" << buffer << std::endl;
        
        // 发送响应
        write(sock, response.c_str(), response.length());
    }

    // 关闭连接
    close(sock);
    delete (int *)socket_desc;

    return NULL;
}

int main() {
    int server_fd, client_sock;
    struct sockaddr_in server_addr, client_addr;
    socklen_t addr_len = sizeof(struct sockaddr_in);

    // 创建 socket
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd == -1) {
        std::cerr << "Failed to create socket." << std::endl;
        return 1;
    }

    // 设置服务器地址和端口
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(8080);

    // 绑定地址和端口
    if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        std::cerr << "Failed to bind." << std::endl;
        return 1;
    }

    // 监听连接
    if (listen(server_fd, 10) < 0) {
        std::cerr << "Failed to listen." << std::endl;
        return 1;
    }

    std::cout << "Server started. Listening on port 8080..." << std::endl;

    while (true) {
        // 接受客户端连接
        client_sock = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len);
        if (client_sock < 0) {
            std::cerr << "Failed to accept connection." << std::endl;
            continue;
        }

        std::cout << "New connection accepted." << std::endl;

        // 创建线程处理连接
        pthread_t thread;
        int *new_sock = new int;
        *new_sock = client_sock;

        if (pthread_create(&thread, NULL, connection_handler, (void *)new_sock) < 0) {
            std::cerr << "Failed to create thread." << std::endl;
            return 1;
        }

        // 分离线程,使其自行释放资源
        pthread_detach(thread);
    }

    // 关闭服务器 socket
    close(server_fd);

    return 0;
}

代码解析:

这段代码实现了一个简单的基于Linux的轻量级多线程HTTP服务。它的主要逻辑如下:

  1. 引入所需的头文件和库:包括iostream(用于输入输出)、string(用于处理字符串)、cstring(用于字符串操作)、sys/socket.h和arpa/inet.h(用于socket编程)、unistd.h(用于关闭连接)和pthread.h(用于多线程编程)。

  2. 定义常量和变量:将缓冲区大小定义为BUFFER_SIZE,并声明服务器socket文件描述符(server_fd)和客户端socket文件描述符(client_sock),以及服务器地址(server_addr)和客户端地址(client_addr)。

  3. 创建连接处理函数:定义了一个名为connection_handler的函数,该函数作为每个连接的处理函数。它接受一个void*类型的参数,将其转换为int*类型,表示客户端socket文件描述符。在该函数中,首先从客户端读取请求并打印到控制台,然后向客户端发送固定的HTTP响应。最后关闭客户端socket连接,并释放分配的内存。

  4. 主函数:在主函数中,首先创建服务器socket(server_fd)。然后设置服务器地址和端口,并将其与socket绑定。接下来,开始监听连接请求。在一个无限循环中,使用accept函数接受客户端连接,并创建一个新的线程来处理连接。为了能够将客户端socket传递给新线程,使用new运算符动态分配了一个int类型的指针new_sock,并将客户端socket文件描述符赋值给它。然后,使用pthread_create函数创建一个新的线程,将新线程的执行函数设置为connection_handler,并将new_sock作为参数传递给新线程。最后,使用pthread_detach函数将新线程设置为分离状态,使其在完成后自动释放资源。

  5. 关闭服务器socket:在无限循环中无法达到的代码,当服务端结束时,关闭服务器socket(server_fd)。

这段代码使用了基本的Linux系统调用和pthread库来实现一个简单的多线程HTTP服务。它接受客户端连接,并为每个连接创建一个独立的线程来处理请求和发送响应。需要注意的是,这只是一个简化的示例,实际的HTTP服务器需要考虑更多的功能和错误处理,例如处理HTTP请求的各种方法、路径解析、错误处理等。文章来源地址https://www.toymoban.com/news/detail-596096.html

到了这里,关于基于 Linux 的轻量级多线程 HTTP 服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cpp-httplib: 轻量级、高性能的C++ HTTP/HTTPS客户端和服务器库

    cpp-httplib 是一个轻量级且高效的 C++ HTTP/HTTPS 客户端和服务器库。它由 Hideaki Sone(yhirose)开发,并在 MIT 许可下发布。该项目的主要目标是提供一种简单易用的方式,在 C++ 应用程序中实现 HTTP 和 HTTPS 功能。 项目仓库地址:https://gitcode.com/yhirose/cpp-httplib cpp-httplib 可用于以下场

    2024年04月09日
    浏览(74)
  • Linux项目实战C++轻量级Web服务器源码分析TinyWebServer

    TinyWebServer是Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器.作为新手拿它练手入门再好不过的不二之选,项目开发者社长也写了一些文章帮助初学者理解,但是,非学习总结的总是容易忘,这里记录一下学习过程。 源码链接: https://github.co

    2024年02月16日
    浏览(64)
  • PHP实现轻量级WEB服务器接收HTTP提交的RFID刷卡信息并回应驱动读卡器显示播报语音

     本示例使用的读卡器:RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com)

    2024年02月12日
    浏览(40)
  • Python实现轻量级WEB服务器接收HTTP提交的RFID刷卡信息并回应驱动读卡器显示播报语音

     本示例使用的设备:RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com)

    2024年02月12日
    浏览(52)
  • 轻量级 HTTP 请求组件

    Apache HttpClient 是著名的 HTTP 客户端请求工具——现在我们模拟它打造一套简单小巧的请求工具库, 封装 Java 类库里面的 HttpURLConnection 对象来完成日常的 HTTP 请求,诸如 GET、HEAD、POST 等等,并尝试应用 Java 8 函数式风格来制定 API。 组件源码在:https://gitee.com/sp42_admin/ajaxjs/tr

    2024年02月01日
    浏览(73)
  • C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发002:框架学习-按照三层结构模式重构测试代码+Tcp数据适配+时间轮定时器

    三层结构重构原有功能 自定义消息类,继承UserData,添加一个成员变量szUserData 定义多个Role类继承Irole,重写ProcMsg函数,进行不同处理 定义protocol类,继承Iprotocol,重写四个函数,两个函数时原始 数据和用户数据之间的转换;另两个用来找消息处理对象和消息发 送对象。 定

    2024年02月21日
    浏览(56)
  • 基于lighthouse+长安链的轻量级云服务器产品,实现部署合约、区块链服务一系列操作文档

    长安链已上架一款lighthouse+长安链的轻量级云服务器产品 体验入口:轻量应用服务器Lighthouse_香港轻量服务器_海外轻量服务器-腾讯云 区块链概览 获取区块链ID(DApp需要配置) 合约管理 智能合约git地址:https://git.chainmaker.org.cn/fish/fish1208-chainmaker-lighthouse/-/tree/master/contract EV

    2023年04月08日
    浏览(40)
  • 一些优秀的开源轻量级TCP/IP协议栈

    以下是一些优秀的开源轻量级TCP/IP协议栈,它们适用于嵌入式设备和其他资源受限的环境: lwIP(lightweight IP):lwIP 是一个非常流行的开源 TCP/IP 协议栈,它专门为嵌入式系统设计,具有低内存占用和高效率的特点。lwIP 具有TCP、UDP、IP、ICMP、ARP、DNS、SNMP、DHCP等协议的支持,

    2024年02月16日
    浏览(56)
  • 轻量灵动: 革新轻量级服务开发

    从 JDK 8 升级到 JDK 17 可以让你的应用程序受益于新的功能、性能改进和安全增强。下面是一些 JDK 8 升级到 JDK 17 的最佳实战: 1.1、确定升级的必要性:首先,你需要评估你的应用程序是否需要升级到 JDK 17。查看 JDK 17 的新特性、改进和修复的 bug,以确定它们对你的应用程序

    2024年02月07日
    浏览(60)
  • .NET超简单轻量级的HTTP请求组件Flurl

    简介 Flurl是一个用于构建基于HTTP请求的C#代码的库。它的主要目的是简化和优雅地处理网络请求(只用很少的代码完成请求)。Flurl提供了一种简单的方法来构建GET、POST、PUT等类型的请求,以及处理响应和异常。它还提供了一些高级功能,如链式调用、缓存请求结果、自动重

    2024年02月08日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包