整理HttpServer
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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue