整理HttpServer

master
bestlqiang 4 months ago
parent 486ed28c56
commit 9c2146ac04

@ -0,0 +1,117 @@
#include "HttplibServer.h"
#include <filesystem>
#include <vector>
#include <direct.h>
#include <iostream>
#define SERVER_FILE_DIR "/ServerFiles"
#define CMD_GetFileList "GetFileList"
string static GetExeDir()
{
char buff[_MAX_PATH];
_getcwd(buff, _MAX_PATH);
string currPath(buff);
return string(buff);
}
bool static bFileExist(const string& path)
{
ifstream file(path, ios::binary);
return file.good();
}
CHttplibServer::CHttplibServer()
{
}
CHttplibServer::~CHttplibServer()
{
}
bool CHttplibServer::StartHttpServer(string SvrFilesDir /*= ""*/, bool bAsync /*= true*/)
{
m_SvrFilesDir = SvrFilesDir;
auto fStart = [&]
{
httplib::Server svr;
svr.set_payload_max_length(1024 * 1024 * 512); // 512MB
svr.Get(R"(/download/(.+))", [&](const Request& req, Response& res) {OnDownloadFile(req, res);});
svr.Get(R"(/command/(.+))", [&](const Request& req, Response& res) {OnCommandBase(req, res);});
std::cout << "Server started at http://localhost:1234\n";
svr.listen(m_SvrIP, m_Port);
};
bAsync? thread(fStart).detach(): fStart();
return true;
}
void CHttplibServer::OnCommandBase(const Request & req, Response & res)
{
string cmd = req.matches[1];
std::cout << "Rcved Command:" << cmd << endl;
if (cmd.find(CMD_GetFileList) != string::npos)
OnCommand_GetFileList(req, res);
else
OnCommand(cmd, res);
}
void CHttplibServer::OnCommand(string cmd, Response & res)
{
cmd += "Rcved";
res.set_content(cmd, "text/plain");
}
void CHttplibServer::OnDownloadFile(const Request& req, Response& res)
{
if (m_SvrFilesDir.empty())
m_SvrFilesDir = GetExeDir() + SERVER_FILE_DIR;
string FileName = req.matches[1];
string file_path = m_SvrFilesDir+"/"+FileName;
if (!bFileExist(file_path))
{
res.status = 404;
res.set_content("File not found", "text/plain");
return;
}
res.set_file_content(file_path);
return;
}
void CHttplibServer::OnCommand_GetFileList(const Request& req, Response& res)
{
if (m_SvrFilesDir.empty())
m_SvrFilesDir = GetExeDir() + SERVER_FILE_DIR;
vector<string> NameVec = get_file_names(m_SvrFilesDir);
string sRespon;
for (auto const & Name: NameVec)
{
sRespon += Name;
sRespon += ",";
}
res.set_content(sRespon, "text/plain");
}
vector<string> CHttplibServer::get_file_names(const string& Dir)
{
vector<string> NamesVec;
string search_path = Dir + "\\*";
WIN32_FIND_DATAA find_data;
HANDLE hFind = FindFirstFileA(search_path.c_str(), &find_data);
if (hFind != INVALID_HANDLE_VALUE) {
do {
if (!(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
NamesVec.push_back(find_data.cFileName);
}
} while (FindNextFileA(hFind, &find_data));
FindClose(hFind);
}
return NamesVec;
}

@ -0,0 +1,29 @@
#pragma once
#include "../cpp-httplib/httplib.h"
#include <string>
#include <windows.h>
#include <vector>
using namespace std;
using namespace httplib;
class CHttplibServer
{
public:
CHttplibServer();
virtual ~CHttplibServer();
bool StartHttpServer(string SvrFilesDir="",bool bAsync=true);
void SetFilesDir(string Dir) { m_SvrFilesDir = Dir; }
private:
string m_SvrFilesDir;//服务器文件所在文件夹
string m_SvrIP = "0.0.0.0";
int m_Port = 1234;
public:
virtual void OnCommand(string cmd, Response& res);
private:
void OnDownloadFile(const Request& req, Response& res);
void OnCommandBase(const Request& req, Response& res);
void OnCommand_GetFileList(const Request& req, Response& res);//获取服务器文件夹的所有文件名
vector<string> get_file_names(const string & Dir);//获取文件夹内的所有文件名
};

@ -1,75 +1,8 @@
#include <iostream>
#include <fstream>
#include "../cpp-httplib/httplib.h"
#include <filesystem>
#include <vector>
#include <string>
#include <direct.h>
#include <iostream>
#include "HttplibServer.h"
using namespace std;
using namespace httplib;
const string SERVER_FILE_DIR = "/ServerFiles/";
string GetExeDir()
int main()
{
char buff[_MAX_PATH];
_getcwd(buff, _MAX_PATH);
string currPath(buff);
return string(buff);
}
bool file_exists(const string& path) {
ifstream file(path, ios::binary);
return file.good();
}
void send_file(const string& file_path, Response& res) {
ifstream file(file_path, ios::binary | ios::ate);
if (!file) {
res.status = 500; // 服务器错误
res.set_content("Failed to open file", "text/plain");
return;
}
// 获取文件大小
streamsize file_size = file.tellg();
file.seekg(0, ios::beg);
res.set_content_provider(
file_size, "application/octet-stream",
[file_path](size_t offset, size_t length, DataSink& sink) {
ifstream file(file_path, ios::binary);
if (!file) return false;
file.seekg(offset, ios::beg);
vector<char> buffer(length);
file.read(buffer.data(), length);
sink.write(buffer.data(), file.gcount()); // 发送数据
return true; // 继续传输
}
);
}
int main() {
Server svr;
svr.Get(R"(/download/(.+))", [&](const Request& req, Response& res) {
string filename = req.matches[1];
string file_path = GetExeDir()+SERVER_FILE_DIR + filename;
if (!file_exists(file_path)) {
res.status = 404;
res.set_content("File not found", "text/plain");
return;
}
send_file(file_path, res);
});
cout << "Server started at http://localhost:1234\n";
svr.listen("localhost", 1234);
CHttplibServer svr;
svr.StartHttpServer();
getchar();
}

@ -147,10 +147,12 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="HttplibServer.cpp" />
<ClCompile Include="server.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\cpp-httplib\httplib.h" />
<ClInclude Include="HttplibServer.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

@ -18,10 +18,16 @@
<ClCompile Include="server.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="HttplibServer.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\cpp-httplib\httplib.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="HttplibServer.h">
<Filter>头文件</Filter>
</ClInclude>
</ItemGroup>
</Project>
Loading…
Cancel
Save