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

