基于C++的http服务端开发

2023-05-16

1、同时支持get、post接口请求

2、支持文件流下载接口

完整源代码下载地址:https://download.csdn.net/download/GUMU12345/81103130

//
//  sample.cc
//
//  Copyright (c) 2019 Yuji Hirose. All rights reserved.
//  MIT License
//

#include <chrono>
#include <cstdio>
#include "httplib.h"
using namespace httplib;

char* file(const std::wstring &filepath) {
  std::string s;

  OutputDebugString(L"+++++++++++++++++++++++++++++++++");
  HANDLE hFile;
  hFile = CreateFile(filepath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

  if (hFile == INVALID_HANDLE_VALUE)
  {
	  return false;
  }
  DWORD dFileSize = GetFileSize(hFile, NULL);
  char * pBuffer = new char[dFileSize + 1];

  if (pBuffer == NULL)
	  return false;

  memset(pBuffer, 0, dFileSize);

  DWORD dReadSize(0);
  if (!ReadFile(hFile, pBuffer, dFileSize, &dReadSize, NULL))
  {
	  delete[]pBuffer;
	  CloseHandle(hFile);
	  return false;
  }
  delete[]pBuffer;
  //delete[]pBuffer;
  CloseHandle(hFile);
  OutputDebugString(L"________________________________");
  return pBuffer;
}
DWORD filesize(const std::wstring &filepath) {
	std::string s;

	HANDLE hFile;
	hFile = CreateFile(filepath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

	if (hFile == INVALID_HANDLE_VALUE)
	{
		return 0;
	}
	DWORD dFileSize = GetFileSize(hFile, NULL);

	CloseHandle(hFile);
	return dFileSize;
}
std::string dump_headers(const Headers& headers ) {
	std::string s;
	char buf[BUFSIZ];

	for (auto it = headers.begin(); it != headers.end(); ++it) {
	  const auto &x = *it;
	  snprintf(buf, sizeof(buf), "%s: %s\n", x.first.c_str(), x.second.c_str());
	  s += buf;
	}

	return s;
}

std::string log(const Request &req, const Response &res) {
  std::string s;
  char buf[BUFSIZ];

  s += "================================\n";

  snprintf(buf, sizeof(buf), "%s %s %s", req.method.c_str(),
           req.version.c_str(), req.path.c_str());
  s += buf;

  std::string query;
  for (auto it = req.params.begin(); it != req.params.end(); ++it) {
    const auto &x = *it;
    snprintf(buf, sizeof(buf), "%c%s=%s",
             (it == req.params.begin()) ? '?' : '&', x.first.c_str(),
             x.second.c_str());
    query += buf;
  }
  snprintf(buf, sizeof(buf), "%s\n", query.c_str());
  s += buf;

  s += dump_headers(req.headers);

  s += "--------------------------------\n";

  snprintf(buf, sizeof(buf), "%d %s\n", res.status, res.version.c_str());
  s += buf;
  s += dump_headers(res.headers);
  s += "\n";

  if (!res.body.empty()) { s += res.body; }

  s += "\n";

  return s;
}

static std::string g_strVersion = "0.0.0.0";
static char * g_pUpdateFileBuffer = nullptr;
static DWORD g_UpdateFileSzie = 0;
bool InitializeUpgradePackage()
{
	char val[256];
	memset(val, 0, sizeof(val));
	GetPrivateProfileStringA("sys","version","0", val, 256, "./config.ini");
	g_strVersion = val;
	if (g_strVersion == "0")
	{
		printf("请配置config.ini中[version]版本信息\n");
		return false;
	}

	memset(val, 0, sizeof(val));
	GetPrivateProfileStringA("sys", "package", "", val, 256, "./config.ini");
	std::string fileName = val;
	if (fileName == "")
	{
		printf("请配置config.ini中[package]升级包名称\n");
		return false;
	}
	std::string filepath = "./";
	filepath += fileName;

	OutputDebugString(L"+++++++++++++++++++++++++++++++++");
	HANDLE hFile;
	hFile = CreateFileA(filepath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		printf("读取升级包名称失败,请检查当前目录是否存在\n");
		return false;
	}
	DWORD dFileSize = GetFileSize(hFile, NULL);
	g_UpdateFileSzie = dFileSize;

	g_pUpdateFileBuffer = new char[dFileSize + 1];

	if (g_pUpdateFileBuffer == NULL)
		return false;
	memset(g_pUpdateFileBuffer, 0, dFileSize);

	DWORD dReadSize(0);
	if (!ReadFile(hFile, g_pUpdateFileBuffer, dFileSize, &dReadSize, NULL))
	{
		delete[]g_pUpdateFileBuffer;
		CloseHandle(hFile);
		return false;
	}

	CloseHandle(hFile);
	OutputDebugString(L"________________________________");
	return true;
}
int main(void) {
	Server svr;
  if (InitializeUpgradePackage() == false)
  {
	  return 0;
  }

  if (!svr.is_valid()) {
    printf("server has an error...\n");
    return -1;
  }

  svr.Get("/", [=](const Request & /*req*/, Response &res) {
    res.set_redirect("/version");
  });
  svr.Post("/", [=](const Request & /*req*/, Response &res) {
	  res.set_redirect("/version");
  });

  svr.Get("/version", [](const Request & /*req*/, Response &res) {
    res.set_content(g_strVersion, "text/plain");
  });
  svr.Post("/version", [](const Request & /*req*/, Response &res) {
	  res.set_content(g_strVersion, "text/plain");
  });

  svr.Get("/getfile", [](const Request &req, Response &res) {
	  res.set_content(g_pUpdateFileBuffer, g_UpdateFileSzie, "application/octet-stream");
  });
  svr.Post("/getfile", [](const Request &req, Response &res) {
	  res.set_content(g_pUpdateFileBuffer, g_UpdateFileSzie, "application/octet-stream");
  });

  svr.set_error_handler([](const Request & /*req*/, Response &res) {
    const char *fmt = "<p>Error Status: <span style='color:red;'>%d</span></p>";
    char buf[BUFSIZ];
    snprintf(buf, sizeof(buf), fmt, res.status);
    res.set_content(buf, "text/html");
  });

  svr.set_logger([](const Request &req, const Response &res) {
    printf("%s", log(req, res).c_str());
  });

  printf("HTTP Server Run....ok");
  //svr.listen("192.168.0.111", 8080);
  svr.listen("0.0.0.0", 8080);
  return 0;
}

测试截图:

1、服务端运行截图

 

 2、浏览器测试http接口如下

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于C++的http服务端开发 的相关文章

随机推荐

  • BUCK型DC-DC变换器

    前述 DCDC从控制手段上来说分为PWM式 谐振式以及他们的结合式 每 一种方式中从输入与输出之间是否有变压器隔离又可以分为有隔离 无隔离两类 每一类有六种拓扑结构 BUCK Boost BUCK Boost Cuk Sepic和Zeat
  • dubbo服务超时导致的异常org.apache.dubbo.remoting.TimeoutException

    1 dubbo服务超时异常提示信息如下 xff1a cause org apache dubbo remoting TimeoutException Waiting server side response timeout by scan
  • 基于TCP/IP实现串口到网络的通讯转换

    工作模式 通过串口服务器 xff0c 采集到天平的称量值发送到PC端 操作步骤 1 软件测试 测试工具 xff1a USR M0 V2 2 5 8 基础设置 xff1a 模块静态IP 设置成服务器IP xff0c HTTP服务端口 设置成4
  • 结构体的对其规则以及为什么要对其

    结构体的内存对齐规则以及为什么要对齐 内存对齐规则 span class token number 1 span 第一个成员在与结构体变量偏移量为 span class token number 0 span 的地址处 span class
  • 宏定义参数

    宏定义的参数以逗号 xff08 作为分隔符 span class token macro property span class token directive keyword include span span class token s
  • [STM32]关于环形队列的实现

    在程序中使用环形队列判断接收数据格式 xff0c 避免在中断中处理造成程序响应速度慢的问题 直接贴代码 xff1a LoopRxCommu h ifndef LOOPRXCOMMU H define LOOPRXCOMMU H includ
  • C#旅程——串口发送数据

    串口发送数据时可以一个byte一个byte的发送数据 xff0c 也可以一次性丢出 xff0c 分多次丢出的话会导致一段数据被分成多段发出 xff0c 中间的延时可能会超过2ms xff0c 与FW通讯时会出现异常 span class t
  • 【记录】一次51单片机串口乱码问题排查

    记录 一次51单片机串口乱码问题排查 项目场景问题描述原因分析解决方案结语 项目场景 在51串口收发仿真实验中使用两个单片机互相通信 xff0c 程序设定A上电1s后通过串口以16进制给B发送AA 直到B收到AA后回复BB xff0c 当A
  • IO流java基础

    二十四 IO流 24 1 File 1 1 File 类概述和构造方法 File 它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的 对于File而言 其封装的并不是一个真正存在的文件 仅仅是一个路径名而已 它可以是存
  • TX2上布置vins_fusion_gpu指南

    1 参考链接 如果初次安装 xff0c 新的TX2环境 xff0c 请参考文档 https github com arjunskumar vins fusion gpu tx2 nano 2 问题记录 1 xff0c 自己的环境情况 我的环
  • Ubuntu下安装cmake

    Ubuntu下安装cmake 今天因为项目的原因需要将cmake升级一下 xff0c 原来我是按照链接没有卸载旧版本 xff0c 直接升级 但是出现一些问题 xff0c 然后我全部卸载后 xff0c 重新安装 以下就是我的安装步骤 第一步
  • AUTH:basic认证和digest认证

    Http authentication BASIC In the context of an HTTP transaction basic access authentication is a method for a web browse
  • Quick Audience组织和工作空间功能解读

    简介 xff1a Quick Audience完成了权限系统全面升级 xff0c 可以解决集团企业不同品牌 不同运营组织 xff0c 不同消费者运营的诉求 xff0c 精细化保障企业数据访问安全 xff0c 提升管控的灵活度 更多关于数智化
  • Socket编程基础总结,全网最全

    IP地址 xff1a 可以在网络环境中 xff0c 唯一标识一台主机 端口号 xff1a 可以定位网络的一台主机上 xff0c 唯一标识一个进程 ip地址 43 端口号 xff1a 可以在网络环境中 xff0c 唯一标识一个进程 在TCP
  • 嵌入式开发--RS-485通讯的问题

    嵌入式开发 RS 485通讯的问题 RS 485说明接口芯片硬件连接CubeMX设置代码编写引脚定义使能串口中断函数发送数据接收数据 有一个问题 xff0c 多收了一个数数据线上的波形问题分析问题解决 RS 485说明 RS 485一般简称
  • UNIX网络编程卷1(第三版)字节排序函数测试

    内存中存储多字节有两种方法 xff0c 即小端字节序和大端字节序 xff0c Ubuntu10 04 是小端字节序 xff0c 网际协议所用的字节序为大端字节序 内存地址增长方向 低序字节 gt 高序字节 小端字节序 高序字节 gt 低序字
  • android非常好的在线视频播放器源码(包含在线音频播放源码)

    一 在线音频播放器 lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt lt LinearLayout xmlns android 61 34 http schemas androi
  • 深入理解任务堆栈

    先来看这一个小函数 xff0c 猜猜他的运行结果 VC6环境 xff1f include lt stdio h gt void b int data 10 printf 34 helloworld r n 34 data 11 61 5 i
  • Protel99seMEX3

    Protel99se的鼠标增强软件 xff0c 可以实现用鼠标放大与缩小电路图 xff0c 十分方便 xff01 文件 xff1a n459 com file 25127180 478161061 以下内容无关 xff1a 分割线 说起Al
  • 基于C++的http服务端开发

    1 同时支持get post接口请求 2 支持文件流下载接口 完整源代码下载地址 xff1a https download csdn net download GUMU12345 81103130 sample cc Copyright c