当前位置: 首页 > news >正文

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)

如:

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\r\n"

             << "Content-Type: " << content_type << "\r\n"

             << "Content-Length: " << content.length() << "\r\n"

             << "Connection: close\r\n"

             << "Access-Control-Allow-Origin: *\r\n"

             << "\r\n"

             << 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] = '\0';

        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

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

6.编译

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

7.运行服务

./bin/windows_server.exe

8.测试服务


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

2.测试接口

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

curl http://localhost:8080/health

http://www.dtcms.com/a/541226.html

相关文章:

  • redis的备份和恢复
  • 北京最大网站建设公司排名做网站的商标是哪类
  • 神经网络初探
  • 鸿蒙Flutter三方库适配指南-04.使用MacOS搭建开发环境
  • 网站建设的风险管理网站开发用了什么平台
  • 鸿蒙应用的启动流程的过程
  • springboot Admin 服务端 客户端配置
  • PHP 中的动态函数调用
  • 设计类参考网站推荐简单企业网站建设
  • 网站优化排名价格网站建设应对客户问题的话术
  • AI IN ALL峰会|百度阿里揭秘智能营销与出海的AI实战
  • 网络安全相关知识
  • wordpress软件站模板外贸采购网官网
  • Apache Flink Keyed State 详解之一
  • 机器学习、深度学习、信号处理领域常用符号速查表
  • Linux小课堂: Squid代理缓存服务器部署与访问控制实战指南
  • 开发Electron程序
  • 中英文网站建站关键词优化ppt
  • 渭南建设用地规划查询网站视觉设计网站建设
  • linux定时任务和发送邮件
  • 零基础新手小白快速了解掌握服务集群与自动化运维(十五)Redis模块-Redis集群理论、手动部署
  • 51zwd一起做网站网站的中英文切换代码
  • 电商领域异地组网需求与解决方案
  • 英语学习 第一天 重难点
  • devc++新建单个文件和新建单个项目
  • 收集域名信息-whois查询
  • Android实战进阶 - CircleIndicator指示器样式定制
  • SQL-leetcode—3475. DNA 模式识别
  • AI搜索优化工具推荐!如何用免费工具帮助内容在AI搜索中抢占排名
  • 【GESP】C++二级真题 luogu-B4411 [GESP202509 二级] 优美的数字