Win+VsCode关于C++项目改造成http服务

具体的MSYS2及vscode关于C++项目的配置,参考上一篇博客:

https://blog.csdn.net/weixin_41212298/article/details/154026060

本项目是在windows系统上进行配置的。

1.基本的 C++ 项目结构

my_project/

├── bin/

├── src/

│   └── main.cpp

├── include/

├── .vscode/

│   ├── tasks.json

│   ├── launch.json

│   └── c_cpp_properties.json

└── Makefile (或 CMakeLists.txt)

如:

Win+VsCode关于C++项目改造成http服务

2.编写示例代码

由于本人使用的windows系统,因此采用纯净版服务

2.1 src/main.cpp:

#define _WIN32_WINNT 0x0A00

#define WIN32_LEAN_AND_MEAN

#include <iostream>

#include <vector>

#include <thread>

#include <mutex>

#include <map>

#include <string>

#include <sstream>

#include <winsock2.h>

#include <ws2tcpip.h>

#pragma comment(lib, “ws2_32.lib”)

using namespace std;

class MathService {

public:

    static int add(int a, int b) { return a + b; }

    static int multiply(int a, int b) { return a * b; }

    

    static vector<int> fibonacci(int n) {

        vector<int> result;

        if (n <= 0) return result;

        result.push_back(0);

        if (n == 1) return result;

        result.push_back(1);

        for (int i = 2; i < n; i++) {

            result.push_back(result[i-1] + result[i-2]);

        }

        return result;

    }

};

string create_response(const string& content, const string& content_type = “application/json”) {

    stringstream response;

    response << “HTTP/1.1 200 OK

             << “Content-Type: ” << content_type << ”

             << “Content-Length: ” << content.length() << ”

             << “Connection: close

             << “Access-Control-Allow-Origin: *

             << ”

             << content;

    return response.str();

}

string handle_request(const string& request) {

    if (request.find(“GET /health”) != string::npos) {

        return create_response(R”({“status”: “healthy”, “service”: “Windows Socket Server”})”);

    }

    else if (request.find(“GET /api/add”) != string::npos) {

        int a = 15, b = 25;

        int result = MathService::add(a, b);

        return create_response(R”({“operation”: “add”, “a”: )” + to_string(a) +

                              R”(, “b”: )” + to_string(b) +

                              R”(, “result”: )” + to_string(result) + “}”);

    }

    else if (request.find(“GET /api/multiply”) != string::npos) {

        int a = 8, b = 7;

        int result = MathService::multiply(a, b);

        return create_response(R”({“operation”: “multiply”, “a”: )” + to_string(a) +

                              R”(, “b”: )” + to_string(b) +

                              R”(, “result”: )” + to_string(result) + “}”);

    }

    else if (request.find(“GET /api/fibonacci”) != string::npos) {

        auto fib_seq = MathService::fibonacci(10);

        string sequence = “[“;

        for (size_t i = 0; i < fib_seq.size(); i++) {

            sequence += to_string(fib_seq[i]);

            if (i < fib_seq.size() – 1) sequence += “, “;

        }

        sequence += “]”;

        return create_response(R”({“operation”: “fibonacci”, “sequence”: )” + sequence + “}”);

    }

    else {

        string html = R”(

<!DOCTYPE html>

<html>

<head>

    <title>C++ Windows Socket Server</title>

</head>

<body>

    <h1>✅ C++ Windows Socket 服务器运行中</h1>

    <p>这是一个纯 Windows Socket 实现的 HTTP 服务器</p>

    <ul>

        <li><a href=”/health”>/health</a> – 健康检查</li>

        <li><a href=”/api/add”>/api/add</a> – 加法服务</li>

        <li><a href=”/api/multiply”>/api/multiply</a> – 乘法服务</li>

        <li><a href=”/api/fibonacci”>/api/fibonacci</a> – 斐波那契数列</li>

    </ul>

</body>

</html>

        )”;

        return create_response(html, “text/html”);

    }

}

void handle_client(SOCKET client_socket) {

    char buffer[4096];

    int bytes_received = recv(client_socket, buffer, sizeof(buffer) – 1, 0);

    

    if (bytes_received > 0) {

        buffer[bytes_received] = '';

        string request(buffer);

        string response = handle_request(request);

        send(client_socket, response.c_str(), response.length(), 0);

    }

    

    closesocket(client_socket);

}

int main() {

    cout << “启动 C++ Windows Socket HTTP 服务器…” << endl;

    

    WSADATA wsaData;

    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {

        cerr << “WSAStartup 失败” << endl;

        return -1;

    }

    

    SOCKET server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (server_socket == INVALID_SOCKET) {

        cerr << “Socket 创建失败” << endl;

        WSACleanup();

        return -1;

    }

    

    sockaddr_in server_addr;

    server_addr.sin_family = AF_INET;

    server_addr.sin_addr.s_addr = INADDR_ANY;

    server_addr.sin_port = htons(8080);

    

    if (bind(server_socket, (sockaddr*)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) {

        cerr << “绑定端口失败” << endl;

        closesocket(server_socket);

        WSACleanup();

        return -1;

    }

    

    if (listen(server_socket, 10) == SOCKET_ERROR) {

        cerr << “监听失败” << endl;

        closesocket(server_socket);

        WSACleanup();

        return -1;

    }

    

    cout << “✅ 服务器启动成功!” << endl;

    cout << “�� 访问地址: http://localhost:8080” << endl;

    cout << “⏹️  按 Ctrl+C 停止服务器” << endl;

    

    while (true) {

        sockaddr_in client_addr;

        int client_addr_len = sizeof(client_addr);

        SOCKET client_socket = accept(server_socket, (sockaddr*)&client_addr, &client_addr_len);

        

        if (client_socket != INVALID_SOCKET) {

            thread client_thread(handle_client, client_socket);

            client_thread.detach();

        }

    }

    

    closesocket(server_socket);

    WSACleanup();

    return 0;

}

3. 配置调试文件

3.1 .vscode/c_cpp_properties.json

{

    “configurations”: [

        {

            “name”: “Linux”,

            “includePath”: [

                “${workspaceFolder}/**”,

                “/usr/include/c++/11”,

                “/usr/include/x86_64-linux-gnu/c++/11”

            ],

            “defines”: [],

            “compilerPath”: “/usr/bin/g++”,

            “cStandard”: “c17”,

            “cppStandard”: “c++17”,

            “intelliSenseMode”: “linux-gcc-x64”

        }

    ],

    “version”: 4

}

3.2 .vscode/tasks.json – 编译任务

{

    “version”: “2.0.0”,

    “tasks”: [

        {

            “label”: “build-http-service”,

            “type”: “shell”,

            “command”: “g++”,

            “args”: [

                “-g”,

                “-std=c++17”,

                “-pthread”,

                “-D_WIN32_WINNT=0x0A00”,

                “-I${workspaceFolder}/include”,

                “-I${workspaceFolder}/third_party”,

                “${workspaceFolder}/src/main.cpp”,

                “-o”,

                “${workspaceFolder}/bin/http_service.exe”,

                “-lws2_32”,

                “-lssl”,

                “-lcrypto”

            ],

            “group”: {

                “kind”: “build”,

                “isDefault”: true

            },

            “detail”: “编译 HTTP 服务版本 (Windows)”,

            “problemMatcher”: [“$gcc”]

        }

    ]

}

3.3 .vscode/launch.json – 调试配置

{

    “version”: “0.2.0”,

    “configurations”: [

        {

            “name”: “Debug HTTP Service”,

            “type”: “cppdbg”,

            “request”: “launch”,

            “program”: “${workspaceFolder}/bin/http_service.exe”,

            “args”: [],

            “stopAtEntry”: false,

            “cwd”: “${workspaceFolder}”,

            “environment”: [],

            “externalConsole”: true,

            “MIMode”: “gdb”,

            “setupCommands”: [

                {

                    “description”: “为 gdb 启用整齐打印”,

                    “text”: “-enable-pretty-printing”,

                    “ignoreFailures”: true

                }

            ],

            “preLaunchTask”: “build-http-service”,

            “miDebuggerPath”: “gdb”

        }

    ]

}

4. 创建lib空文件夹

需要创建lib文件夹,否则会报错

5. 利用MSYS2导航到项目目录

     cd  /d/project/server/git/simulation/simulationAlgorithm

Win+VsCode关于C++项目改造成http服务

注意是项目目录,不是src目录

6.编译

g++ -std=c++17 -I./include src/main.cpp -o bin/windows_server.exe -lws2_32

Win+VsCode关于C++项目改造成http服务

7.运行服务

./bin/windows_server.exe

Win+VsCode关于C++项目改造成http服务

8.测试服务

1.打开浏览器访问:http://localhost:8080

Win+VsCode关于C++项目改造成http服务

2.测试接口

在cmd中输入如下命令,查看服务健康状态:

curl http://localhost:8080/health

Win+VsCode关于C++项目改造成http服务

9.在VSCODE中配置MYSY2编译运行环境

9.1调出配置

在最上面搜索框输入>或者Ctrl+Shift+P调出来,选择select Default Profile

Win+VsCode关于C++项目改造成http服务

如果没有关于MSYS2的选项,如下图所示:

Win+VsCode关于C++项目改造成http服务

那么需要进行MSYS2的配置:

9.2 打开 VSCode 设置

按 Ctrl+Shift+P,输入 “Preferences: Open Settings (JSON)”

Win+VsCode关于C++项目改造成http服务

9.3添加配置

在 settings.json 中添加配置

{

    “terminal.integrated.profiles.windows”: {

        “PowerShell”: {

            “source”: “PowerShell”,

            “icon”: “terminal-powershell”

        },

        “Command Prompt”: {

            “path”: [

                “${env:windir}\Sysnative\cmd.exe”,

                “${env:windir}\System32\cmd.exe”

            ],

            “args”: [],

            “icon”: “terminal-cmd”

        },

        “MSYS2 UCRT64”: {

            “path”: “D:\Soft\mysys2\msys2_shell.cmd”,

            “args”: [

                “-defterm”,

                “-here”,

                “-no-start”,

                “-ucrt64”

            ],

            “icon”: “terminal-bash”

        },

        “MSYS2 MINGW64”: {

            “path”: “D:\Soft\mysys2\msys2_shell.cmd”,

            “args”: [

                “-defterm”,

                “-here”,

                “-no-start”,

                “-mingw64”

            ],

            “icon”: “terminal-bash”

        }

    },

    “terminal.integrated.defaultProfile.windows”: “MSYS2 UCRT64”}

注意: 把 “D:\Soft\mysys2\msys2_shell.cmd” 替换为你的实际 MSYS2 安装路径。

9.4 检查MSYS2路径

首先确认你的 MSYS2 安装路径,比如到达安装位置,输入msys2_shell.cmd 如果能够打开MSYS2的界面,就是正确的路径

Win+VsCode关于C++项目改造成http服务

Win+VsCode关于C++项目改造成http服务

重新调出配置

然后在最上面搜索框输入>或者ctrl+shift+p调出来

选择select Default Profile  

Win+VsCode关于C++项目改造成http服务

选择MSYS2 UCRT64模式,再点击调试部分下面的➕按钮,重新打开一个终端,就是目标的终端了。

Win+VsCode关于C++项目改造成http服务

10.一键启动高阶版本:

start_with_msys2.bat:



@echo off
chcp 65001 >nul
title C++ HTTP 服务启动器
 
echo ====================================
echo   自动启动MSYS2并运行HTTP服务
echo ====================================
echo.
 
REM 直接设置你的MSYS2路径
set MSYS2_PATH=D:Softmysys2anzhuang
 
if not exist "%MSYS2_PATH%msys2_shell.cmd" (
    echo ❌ 未找到MSYS2安装路径!
    echo 请检查路径: %MSYS2_PATH%
    pause
    exit /b 1
)
 
echo ✅ 找到MSYS2路径: %MSYS2_PATH%
echo.
 
REM 获取当前脚本所在目录
set "PROJECT_DIR=%~dp0"
set "PROJECT_DIR=%PROJECT_DIR:~0,-1%"
 
echo 📁 项目目录: %PROJECT_DIR%
echo.
 
REM 检查是否在MSYS2环境中编译过
if not exist "binwindows_server.exe" (
    echo 🔨 需要先编译服务器...
    "%MSYS2_PATH%msys2_shell.cmd" -defterm -here -no-start -ucrt64 -shell bash -c "cd '%PROJECT_DIR%' && g++ -std=c++17 -I./include src/main.cpp -o bin/windows_server.exe -lws2_32 && echo '✅ 编译完成!按Enter键继续...' && read"
)
 
echo 🚀 启动HTTP服务...
echo 📍 服务地址: http://localhost:8080
echo 📍 健康检查: http://localhost:8080/health
echo ⏹️  按 Ctrl+C 停止服务
echo.
 
REM 启动服务(保持窗口打开)
"%MSYS2_PATH%msys2_shell.cmd" -defterm -here -ucrt64 -shell bash -c "cd '%PROJECT_DIR%' && ./bin/windows_server.exe"

运行该文件,可以实现自动打开MSYS2,并运行服务。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...