rkey

rkey

cpp寫一個http伺服器

在沒有使用任何高級框架的情況下,你可以使用 C++ 標準庫和一些系統調用來實現一個簡單的 HTTP 伺服器。以下是一個基本的示例,展示了如何使用 C++ 標準庫中的 <iostream><sys/socket.h> 等頭文件來創建一個簡單的 HTTP 伺服器,接收請求並返回一個簡單的響應。這個 http 伺服器只處理了一次網絡請求,如果想要不斷處理請求,後面可以加入一個循環,讓請求一直可以被處理。

示例:簡單的 HTTP 伺服器#

這個示例將使用原始的 socket 編程來創建一個簡單的 HTTP 伺服器,監聽端口並處理 incoming 連接。

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

int main() {
    // 創建 socket
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) {
        std::cerr << "創建 socket 時出錯" << std::endl;
        return 1;
    }

    // 設置 socket 選項,允許重用地址
    int opt = 1;
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
        std::cerr << "設置 socket 選項時出錯" << std::endl;
        return 1;
    }

    // 伺服器地址結構
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    memset(&address, 0, sizeof(address));
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    // 綁定 socket 到地址
    if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {
        std::cerr << "綁定 socket 時出錯" << std::endl;
        return 1;
    }

    // 監聽連接
    if (listen(server_fd, 3) < 0) {
        std::cerr << "監聽 socket 時出錯" << std::endl;
        return 1;
    }

    std::cout << "伺服器正在端口 8080 上監聽" << std::endl;

    // 接受連接
    int new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen);
    if (new_socket < 0) {
        std::cerr << "接受連接時出錯" << std::endl;
        return 1;
    }

    // 接收請求
    char buffer[1024] = {0};
    read(new_socket, buffer, 1024);
    std::cout << "請求: " << buffer << std::endl;

    // 發送響應
    const std::string response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<html><body><h1>你好,世界!</h1></body></html>";
    send(new_socket, response.c_str(), response.size(), 0);

    // 關閉 socket
    close(new_socket);
    close(server_fd);

    return 0;
}

代碼解釋#

  1. 創建 Socket

    • 使用 socket 函數創建一個 TCP socket。
  2. 設置 Socket 選項

    • 使用 setsockopt 函數設置 SO_REUSEADDRSO_REUSEPORT 選項,允許重用地址和端口。
  3. 伺服器地址結構

    • 使用 sockaddr_in 結構體來存儲伺服器的地址信息。
    • INADDR_ANY 表示伺服器可以接受任何 IP 地址的連接。
  4. 綁定 Socket

    • 使用 bind 函數將 socket 綁定到指定的地址和端口。
  5. 監聽連接

    • 使用 listen 函數開始監聽連接,參數 3 表示最大連接隊列長度。
  6. 接受連接

    • 使用 accept 函數接受 incoming 連接。
  7. 接收請求

    • 使用 read 函數從連接中讀取請求數據,並打印到標準輸出。
  8. 發送響應

    • 構建一個簡單的 HTTP 響應字符串,並使用 send 函數發送響應。
  9. 關閉 Socket

    • 使用 close 函數關閉連接和監聽 socket。

編譯和運行#

保存上述代碼為 http_server.cpp,然後使用 g++ 編譯並運行:

g++ -o http_server http_server.cpp
./http_server

測試#

打開瀏覽器或使用 curl 測試你的伺服器:

curl http://localhost:8080

你應該會看到返回的 "你好,世界!"。

注意事項#

  • 這個示例僅用於演示目的,實際應用中可能需要處理更多的邊緣情況,如多線程或異步處理多個連接、解析 HTTP 請求、處理不同的 HTTP 方法和路徑等。
  • 為了簡化示例,這裡沒有處理 HTTP 請求的頭部和正文的分離,實際應用中可能需要更複雜的解析邏輯。
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。