最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)HTTP服務(wù)的示例代碼

 更新時間:2025年04月03日 09:21:05   作者:今夜有雨.  
本文主要介紹了C++實現(xiàn)HTTP服務(wù)的示例代碼,C++ HTTP,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、C++Web服務(wù)器(核心代碼WebServer.cpp)

要實現(xiàn)一個簡單的C++Web服務(wù)器,支持GET和POST請求,同時能夠提供靜態(tài)文件(如JavaScript、CSS和圖片文件)。

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <unordered_map>
#include <netinet/in.h>
#include <unistd.h>
#include <sys/stat.h>
using namespace std;

#define PORT 8080   // 端口號

#define BUFFER_SIZE 4096   // 緩沖區(qū)大小

//根據(jù)文件拓展名返回適當?shù)腃ontent-Type
std::string getContentType(const std::string &path){
    if(path.ends_with(".html")) return "text/html";
    if(path.ends_with(".css")) return "text/css";
    if(path.ends_with(".js")) return "application/javascript";
    if(path.ends_with(".png")) return "image/png";
    if(path.ends_with(".jpg")) return "image/jpeg";
    if(path.ends_with(".jpeg")) return "image/jpeg";
    if(path.ends_with(".gif")) return "image/gif";
    return "text/plain";

}

//讀取靜態(tài)文件
std::string readFile(const std::string &path){
    //創(chuàng)建一個輸入文件流對象,以二進制模式打開指定路徑的文件
    std::ifstream file(path,std::ios::binary);

    //檢查文件是否成功打開
    if(!file.is_open()){
        perror("file open failed");
        //如果打開失敗返回空字符串
        return "";
    }
    //創(chuàng)建一個輸出字符串流對象,用于將文件內(nèi)容讀取到字符串
    std::ostringstream ss;

    //使用輸出字符串流對象的rdbuf()將文件內(nèi)容讀取到字符串中
    //這實際上是將文件流中的所有字節(jié)復(fù)制到字符串流的緩沖區(qū)中
    ss<<file.rdbuf();

    //將字符串流的內(nèi)容轉(zhuǎn)換為std::string并返回
    return ss.str();

}

//判斷文件是否存在
bool fileExists(const std::string &path){
    struct stat buffer;
    return stat(path.c_str(), &buffer)==0;
}

int main() {
    // 創(chuàng)建套接字
    int server_fd, new_socket;
    // 地址結(jié)構(gòu)體
    struct sockaddr_in address;

    int opt=1;  // 設(shè)置套接字選項
    int addlen = sizeof(address);// 地址結(jié)構(gòu)體長度

    char buffer[BUFFER_SIZE] = {0};   // 緩沖區(qū)

    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0))==0){
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    //設(shè)置端口復(fù)用
    //如果你不是用SO_REUSEADDR,服務(wù)器程序關(guān)閉后,可能會出現(xiàn)“Address already in use” 錯誤
    //尤其是當你嘗試在同一個端口上重新啟動服務(wù)器時,這是因為TCP連接可能會保持TIME_WAIT的狀態(tài)一段時間
    //而SO_REUSEADDR允許套接字在這種狀態(tài)下重新綁定到另一個端口
    if(setsoocketopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))){
        perror("setsoocketopt failed");
        exit(EXIT_FAILURE);
    }

    //配置服務(wù)器地址
    addrss.sin_family = AF_INET;
    addrss.sin_addr.s_addr = INADDR_ANY;
    addrss.sin_port = htons(PORT);

    //綁定套接字
    if(bind(server_fd, (struct sockaddr *)&address, addlen)<0){
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    //監(jiān)聽請求
    if(listen(server_fd, 3)<0){
        perror("listen failed");
        exit(EXIT_FAILURE);
    }
    cout<<"WebServer is running on port"<<PORT<<"....\n";

    while(true)
    {
        //接受客戶端連接
        if((new_socket=accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addlen))<0){
            perror("accept failed");
            exit(EXIT_FAILURE);
        }

        //讀取客戶端請求
        read(new_socket, buffer, BUFFER_SIZE);
        cout<<"Request received :\n"<<buffer<<endl;

        //解析Http請求
        //這段代碼是解析Http請求中提取 請求方法、路徑和Http版本。如下:
        //第一次提取method,得到:GET
        //第二次提取path,得到:/index.html
        //第三次提取version,得到:HTTP/1.1
        std::istringstream request(buffer);
        std::string method , path , version;
        request>>method>>path>>version;

        //默認首頁
        if(path=="/")
        {
            path="/index.html";
        }
        //構(gòu)建文件路徑
        std::string filePath ="."+path;

        //處理GET請求
        if(method=="GET"){
            if(fileExists(filePath)){//文件存在
                std::string content = readFile(filePath);//讀取文件內(nèi)容
                std::string contentType = getContentType(filePath);//獲取文件類型

                std::ostringstream response;  // 構(gòu)建響應(yīng)
                response<<"HTTP/1.1 200 OK\r\n"
                        <<"Content-Type:"<<contentType<<"\r\n"
                        <<"Content-Length:"<<content.length()<<"\r\n"
                        <<"\r\n"
                        <<content;//響應(yīng)頭和響應(yīng)體
                response<<content;

                //發(fā)送響應(yīng)
                send(new_socket, response.str().c_str(), response.str().length(), 0);
            }else{
                //404 NOT FOUND
                std::string notFound="HTTP/1.1 404 Not Found\r\n\r\n404 Not Found";
                send(new_socket, notFound.c_str(), notFound.length(), 0);
            }
        }
        else if(method=="POST"){//處理POST請求
            //簡單的響應(yīng)客戶端的POST請求(可以根據(jù)需要解析POST請求)
            std::string response="HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nPOST request";
            send(new_socket, response.c_str(), response.length(), 0);
        }else{
            //405 METHOD NOT ALLOWED
            std::string notAllowed="HTTP/1.1 405 Method Not Allowed\r\n\r\n405 Method Not Allowed";
            send(new_socket, notAllowed.c_str(), notAllowed.length(), 0);
        }
        //關(guān)閉連接
        close(new_socket);

    }
    //釋放資源,關(guān)閉服務(wù)器套接字
    close(server_fd);

    return 0;
}

二、靜態(tài)文件結(jié)構(gòu)

  • 確保你的HTML、CSS、JS和圖片文件都存放在與可執(zhí)行程序相同的目錄下或適當?shù)淖幽夸浿?,例如?/li>
./index.html
./style.css
./script.js
./images/example.jjpg

在這里插入圖片描述

假設(shè)HTL文件是這樣的:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>這是一個簡單的WebServer</title>
    <style>
        body{
            font-family: Arial,sans-serif;
            background-color: #f4f4f9;
            color: #333;
            margin: 0;
            padding: 0;
        }
        header{
            background-color: #4CAF50;
            color: white;
            padding: 10px 0;
        }
        h1{
            margin: 0;
        }
        p{
            font-size: 1.2em;
            margin: 20px auto;
            width: 80%;
        }
        footer{
            position: fixed;
            bottom: 0;
            width: 100%;
            background-color: #4CAF50;
            color: white;
            padding: 10px 0;
        }
    </style>
</head>
<body>
<header>
    <h1>這是一個簡單的WebServer</h1>
</header>
<main>
    <p>這是一個簡單的WebServer,你可以在這里放置一些內(nèi)容。</p>
    <br/>
    <img src="23.png" alt="C++測試">
</main>
<footer>
    <p>
        &copy;2025 My WebServer By HuJiaHang
    </p>
</footer>

</body>
</html>

三、編譯和運行

  • 編譯
g++ -std=c++20 WebServer.cpp -o WebServer
//使用C++20標準,是因為std::string::ends_with()是C++20引入的功能
  • 運行:執(zhí)行編譯好的WebServer程序
./WebServer

四、訪問測試

使用瀏覽器訪問http://localhost:8080,可以獲取靜態(tài)HTML頁面、CSS樣式、JavaScript腳本和圖片

注意:如果使用的是云服務(wù)器,就必須要在安全組中放開端口

以下是我的測試

在這里插入圖片描述

在這里插入圖片描述

到此這篇關(guān)于C++實現(xiàn)HTTP服務(wù)的示例代碼的文章就介紹到這了,更多相關(guān)C++ HTTP服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 利用C++的基本算法實現(xiàn)十個數(shù)排序

    利用C++的基本算法實現(xiàn)十個數(shù)排序

    以下是對利用C++的基本算法實現(xiàn)十個數(shù)排序的代碼進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C++單例模式的幾種實現(xiàn)方法詳解

    C++單例模式的幾種實現(xiàn)方法詳解

    這篇文章主要為大家詳細介紹了C++單例模式的幾種實現(xiàn)方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言實現(xiàn)簡單彈跳小球

    C語言實現(xiàn)簡單彈跳小球

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單彈跳小球,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • c語言在控制臺判定鼠標左鍵的小例子

    c語言在控制臺判定鼠標左鍵的小例子

    c語言在控制臺判定鼠標左鍵的小例子,需要的朋友可以參考一下
    2013-06-06
  • C++高效內(nèi)存池實現(xiàn)減少動態(tài)分配開銷的解決方案

    C++高效內(nèi)存池實現(xiàn)減少動態(tài)分配開銷的解決方案

    C++動態(tài)內(nèi)存分配存在系統(tǒng)調(diào)用開銷、碎片化和鎖競爭等性能問題,內(nèi)存池通過預(yù)分配、分塊管理和緩存復(fù)用解決這些問題,下面就來了解一下
    2025-06-06
  • C語言實現(xiàn)linux網(wǎng)卡檢測改進版

    C語言實現(xiàn)linux網(wǎng)卡檢測改進版

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)linux網(wǎng)卡檢測的改進版,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 詳解C語言printf()輸出格式

    詳解C語言printf()輸出格式

    這篇文章主要介紹了C語言printf()輸出格式,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Qt圓角窗口的兩種實現(xiàn)方案詳解

    Qt圓角窗口的兩種實現(xiàn)方案詳解

    在Qt中設(shè)置控件的圓角通常可以通過Qt樣式表(QSS)來實現(xiàn),這是一種非常靈活且強大的方式來定制Qt控件的外觀,這篇文章主要介紹了Qt圓角窗口的兩種實現(xiàn)方案,需要的朋友可以參考下
    2026-01-01
  • C++常見錯誤中英文對照表

    C++常見錯誤中英文對照表

    對于剛學(xué)編程,剛接觸C++的新手來說,編譯運行報錯是最頭疼的一件事,爆出一堆英文,英語差一點的又不知道什么意思,所以也不知道如何去改,在此,我給大家傳一份常見錯誤中英文對照表及簡單解釋,希望可以幫到大家
    2016-05-05
  • C語言熱門考點結(jié)構(gòu)體與內(nèi)存對齊詳解

    C語言熱門考點結(jié)構(gòu)體與內(nèi)存對齊詳解

    在掌握基本的結(jié)構(gòu)體使用后,我們在面試和大型比賽中常常會遇到一個熱門考點:結(jié)構(gòu)體內(nèi)存對齊,也就是計算結(jié)構(gòu)體大小。接下來請跟著筆者一起來學(xué)習(xí)這塊知識點吧
    2021-10-10

最新評論

平定县| 岳阳市| 安达市| 平乐县| 冷水江市| 遵义市| 怀集县| 建始县| 平谷区| 松滋市| 永宁县| 佛山市| 辉南县| 黎川县| 安乡县| 宽城| 红原县| 教育| 南雄市| 洛宁县| 衡阳县| 郓城县| 莱州市| 望城县| 宁都县| 句容市| 十堰市| 桐庐县| 肃南| 西城区| 咸阳市| 泽普县| 湟源县| 昭觉县| 乐清市| 察隅县| 丹江口市| 长沙县| 河北省| 沈丘县| 波密县|