基于asio的httpclient实现

基于Asio实现一个简易的httpclient

Asio是C++的一个高性能网络编程库,提供了跨平台的网络和底层I/O编程接口,包括tcp,udp等sockets通信,以及异步编程模型。它的设计目标是为C++开发者提供一种简单、直接的方式来处理网络通信和并行I/O操作,同时保持高效和灵活性。

知识点

  • 使用asio::io_context ioctx;作为整个网络IO和回调的上下文
  • 使用std::thread processor;作为ioctx的执行线程,只需要在线程函数里执行ioctx.run()即可触发io事件循环工作
  • 使用asio::executor_work_guard<asio::io_context::executor_type> work;保证ioctx不会因为没有执行任务而结束,导致线程退出
  • 使用 asio::ip::tcp::resolver resolver_;进行dns域名解析
  • 使用std::promise/std::future进行异步任务同步等待,类似于javascript的async/await

源码

https://github.com/samxfb/cpp-httpclient

编译输出cpp-httpclient

Usage:
./cpp-httpclient [ip] [port] [method:GET/POST...] [url/path]
./cpp-httpclient --host [host] [method:GET/POST...] [url/path]

测试用例

1、借助在线的http服务(https://httpbin.org/

./cpp-httpclient --host httpbin.org GET /get

connect httpbin.org [ip 184.73.216.86, port 80]

RESULT: HTTP/1.1 200  OK
response message:
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Host": "httpbin.org", 
    "X-Amzn-Trace-Id": "Root=1-65ab4f91-7370ba8a2d5dee213fb955d6"
  }, 
  "origin": "218.108.104.131", 
  "url": "http://httpbin.org/get"
}

2、自己搭建一个简易的静态http服务器

  • 基于apache搭建

详见(Linux系统下Web文件系统搭建

  • 使用python自带的http.server模块

python3 -m http.server 9000, 端口号为9000

  • 基于Node.js的轻量级静态HTTP服务器http-server

安装:npm install -g http-server
运行:http-server --port 9000

以下测试启动node.js http-server进行:

(base) sam@SamdeMacBook-Pro:~/Desktop/test/cpp-httpclient$ http-server --port 9000
Starting up http-server, serving ./

http-server version: 14.1.1

http-server settings: 
CORS: disabled
Cache: 3600 seconds
Connection Timeout: 120 seconds
Directory Listings: visible
AutoIndex: visible
Serve GZIP Files: false
Serve Brotli Files: false
Default File Extension: none

Available on:
  http://127.0.0.1:9000
  http://10.18.146.230:9000
Hit CTRL-C to stop the server

http客户端请求

./cpp-httpclient 127.0.0.1 9000 GET /build.sh

RESULT: HTTP/1.1 200  OK
response message:
#!/bin/bash

g++ -std=c++11 -I. -I./thirdparty/asio/asio/include -pthread -o cpp-httpclient test.cpp

相关推荐

  1. 基于asiohttpclient实现

    2024-01-22 14:54:04       55 阅读
  2. HttpClient4基础

    2024-01-22 14:54:04       40 阅读
  3. 基于jdk11和基于apache-httpclienthttp请求工具类

    2024-01-22 14:54:04       48 阅读
  4. 实现简易 axios

    2024-01-22 14:54:04       46 阅读
  5. HttpClient

    2024-01-22 14:54:04       129 阅读
  6. 简易版axios实现-基于promise+XMLHttpRequest

    2024-01-22 14:54:04       42 阅读
  7. axios基本使用

    2024-01-22 14:54:04       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-22 14:54:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-22 14:54:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-22 14:54:04       82 阅读
  4. Python语言-面向对象

    2024-01-22 14:54:04       91 阅读

热门阅读

  1. 【Linux】进程退出和进程等待

    2024-01-22 14:54:04       50 阅读
  2. JVM知识点总结

    2024-01-22 14:54:04       58 阅读
  3. spring mvc的HandlerInterceptor的原理以及使用场景

    2024-01-22 14:54:04       54 阅读
  4. Android:RecyclerView自由拖动item

    2024-01-22 14:54:04       58 阅读
  5. Ubuntu 22报错:PAM unable to dlopen(pam_tally2.so)

    2024-01-22 14:54:04       60 阅读
  6. QT 浏览器组件使用

    2024-01-22 14:54:04       55 阅读
  7. 二、docker的常用命令(持续补充img)

    2024-01-22 14:54:04       50 阅读
  8. SpringMVC使用步驟

    2024-01-22 14:54:04       57 阅读
  9. windows11+GPU1060安装强化学习环境之pytorch

    2024-01-22 14:54:04       56 阅读
  10. 【shell编程入门】正则表达式

    2024-01-22 14:54:04       56 阅读
  11. elemeentui el-table封装

    2024-01-22 14:54:04       46 阅读