c++搭建http服务器

HTTP请求协议格式如下: 

HTTP响应协议格式如下: 

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <string>

#pragma comment(lib, "ws2_32.lib")

//std::string generateResponse(const std::string& request) {
//    // 在此处根据实际需求生成相应的HTTP响应
//    std::string response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
//    response += "<html><body><h1>Hello, World!</h1></body></html>";
//    return response;
//}

std::string generateResponse(const std::string& request) {
    // 在此处根据实际需求生成相应的HTTP响应
    std::string response = "HTTP/1.1 200 OK\r\n";
    response += "Content-Type: text/html\r\n";
    response += "Access-Control-Allow-Origin: *\r\n";
    //response += "Access-Control-Allow-Origin: http://localhost:8080\r\n"; // 允许http://localhost:8080的请求
    response += "Access-Control-Allow-Methods: GET, POST\r\n"; // 允许的请求方法
    response += "Access-Control-Allow-Headers: Content-Type\r\n"; // 允许的请求头
    response += "\r\n";
    response += "<html><body><h1>Hello, World!</h1></body></html>";
    return response;
}

int main() {
    // 初始化Winsock
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        std::cerr << "Failed to initialize Winsock." << std::endl;
        return -1;
    }

    // 创建监听套接字
    SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (serverSocket == INVALID_SOCKET) {
        std::cerr << "Failed to create server socket." << std::endl;
        WSACleanup();
        return -1;
    }

    // 绑定地址和端口
    sockaddr_in serverAddress;
    serverAddress.sin_family = AF_INET;                   // IPv4
    serverAddress.sin_addr.s_addr = INADDR_ANY;           // 使用任意可用地址
    serverAddress.sin_port = htons(8080);                 // 监听端口8080

    if (bind(serverSocket, (sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR) {
        std::cerr << "Bind failed with error: " << WSAGetLastError() << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return -1;
    }

    // 开始监听
    if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {
        std::cerr << "Listen failed with error: " << WSAGetLastError() << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return -1;
    }

    std::cout << "Server started. Waiting for connections..." << std::endl;

    while (true) {
        // 等待客户端连接
        sockaddr_in clientAddress;
        int clientAddressSize = sizeof(clientAddress);
        SOCKET clientSocket = accept(serverSocket, (sockaddr*)&clientAddress, &clientAddressSize);
        if (clientSocket == INVALID_SOCKET) {
            std::cerr << "Accept failed with error: " << WSAGetLastError() << std::endl;
            closesocket(serverSocket);
            WSACleanup();
            return -1;
        }

        std::cout << "Client connected." << std::endl;

        // 接收和发送数据
        const int bufferSize = 4096;
        char requestBuffer[bufferSize];
        memset(requestBuffer, 0, sizeof(requestBuffer));

        if (recv(clientSocket, requestBuffer, sizeof(requestBuffer), 0) == SOCKET_ERROR) {
            std::cerr << "Receive failed with error: " << WSAGetLastError() << std::endl;
            closesocket(clientSocket);
            closesocket(serverSocket);
            WSACleanup();
            return -1;
        }

        std::string request(requestBuffer);

        // 解析HTTP请求,获取请求路径等信息
        std::string requestPath;

        size_t firstSpace = request.find(' ');
        size_t secondSpace = request.find(' ', firstSpace + 1);

        if (firstSpace != std::string::npos && secondSpace != std::string::npos) {
            requestPath = request.substr(firstSpace + 1, secondSpace - firstSpace - 1);
        }

        std::cout << "Request: " << requestPath << std::endl;

        // 生成HTTP响应
        std::string response = generateResponse(requestPath);

        // 发送HTTP响应
        if (send(clientSocket, response.c_str(), response.size(), 0) == SOCKET_ERROR) {
            std::cerr << "Send failed with error: " << WSAGetLastError() << std::endl;
            closesocket(clientSocket);
            closesocket(serverSocket);
            WSACleanup();
            return -1;
        }

        // 关闭客户端连接
        std::cout << "Client disconnected." << std::endl;
        closesocket(clientSocket);
    }

    // 清理Winsock
    closesocket(serverSocket);
    WSACleanup();

    return 0;
}
    test(){
        fetch("http://127.0.0.1:8080").then((response: Response) => {
            return response.text()
        }).then((value) => {
            console.log(value);
            console.log("dsfasd");
        })
    }

相关推荐

  1. Pythonhttp下载服务器

    2023-12-06 16:02:02       15 阅读
  2. Nodejs+ExpressHTTPS服务

    2023-12-06 16:02:02       37 阅读
  3. 文件服务器

    2023-12-06 16:02:02       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-06 16:02:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-06 16:02:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-06 16:02:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-06 16:02:02       20 阅读

热门阅读

  1. P5706 【深基2.例8】再分肥宅水

    2023-12-06 16:02:02       44 阅读
  2. AIOps、微服务和云平台

    2023-12-06 16:02:02       36 阅读
  3. 做题笔记:SQL Sever 方式做牛客SQL的题目--VQ29

    2023-12-06 16:02:02       33 阅读
  4. 蓝桥杯官网练习题(平均)

    2023-12-06 16:02:02       40 阅读
  5. vscode配置代码片段

    2023-12-06 16:02:02       35 阅读
  6. rocketmq 集群环境部署及与spring cloud 集成

    2023-12-06 16:02:02       30 阅读
  7. RepidJson将内容写入文件简单代码示例

    2023-12-06 16:02:02       35 阅读
  8. 深度学习中的Transformer机制

    2023-12-06 16:02:02       37 阅读
  9. 封装请求头内容格式

    2023-12-06 16:02:02       37 阅读
  10. Flink-时间窗口

    2023-12-06 16:02:02       49 阅读
  11. AGI = 大模型 + 知识图谱 + 强化学习

    2023-12-06 16:02:02       41 阅读
  12. 数据库事务

    2023-12-06 16:02:02       35 阅读