asio网络编程 tcp、udp、rpc

轻量级的tcp、udp、rpc库,为了简化socket程序编写,基于asio。
提供了轻量级的、方便易用的rpc功能,基于rpc_core。

特性

  • TCP/UDP支持,依赖于:asio
  • RPC支持,依赖于:rpc_core
  • 基于UDP组播的服务发现
  • 支持IPv6和SSL(使用OpenSSL)
  • 支持域套接字和rpc
  • 全面的单元测试
  • 支持串口
  • 自动重连

仓库地址

https://github.com/shuai132/asio_net

asio_net

a tiny Async TCP/UDP/RPC library based on asio
and rpc_core

Features

  • Header-Only
  • TCP/UDP support, rely on: asio
  • RPC support, rely on: rpc_core
  • Service discovery based on UDP multicast
  • Support IPv6 and SSL (with OpenSSL)
  • Support domain socket and rpc
  • Support serial port
  • Comprehensive unittests
  • Automatic reconnection

Options:

  • TCP can be configured to automatically handle the problem of packet fragmentation to support the transmission of
    complete data packets.

  • Supports setting the maximum packet length, and will automatically disconnect if exceeded.

Requirements

  • C++14
  • asio

Usage

The following are examples of using each module. For complete unit tests,
please refer to the source code: test

  • TCP

    You can enable automatic handling of packet fragmentation using tcp_config.
    Subsequent send and receive will be complete data packets.

    By default, this feature is disabled.

  // echo server
  asio::io_context context;
  tcp_server server(context, PORT/*, tcp_config*/);
  server.on_session = [](const std::weak_ptr& ws) {
    auto session = ws.lock();
    session->on_close = [] {
    };
    session->on_data = [ws](std::string data) {
      ws.lock()->send(std::move(data));
    };
  };
  server.start(true);
  // echo client
  asio::io_context context;
  tcp_client client(context/*, tcp_config*/);

  client.on_data = [](const std::string& data) {
  };
  client.on_close = [] {
  };
  client.open("localhost", PORT);
  client.run();
  • UDP
  // server
  asio::io_context context;
  udp_server server(context, PORT);
  server.on_data = [](uint8_t* data, size_t size, const udp::endpoint& from) {
  };
  server.start();
  // client
  asio::io_context context;
  udp_client client(context);
  auto endpoint = udp::endpoint(asio::ip::address_v4::from_string("127.0.0.1"), PORT);
  client.send_to("hello", endpoint);
  context.run();
  • RPC

    rpc based on tcp and rpc_core, and also support ipv6 and ssl.
    more usages, see rpc.cpp and rpc_2.cpp

  // server
  asio::io_context context;
  rpc_server server(context, PORT/*, rpc_config*/);
  server.on_session = [](const std::weak_ptr& rs) {
    auto session = rs.lock();
    session->on_close = [] {
    };
    session->rpc->subscribe("cmd", [](const std::string& data) -> std::string {
      return "world";
    });
  };
  server.start(true);
  // client
  asio::io_context context;
  rpc_client client(context/*, rpc_config*/);
  client.on_open = [](const std::shared_ptr& rpc) {
    rpc->cmd("cmd")
        ->msg(std::string("hello"))
        ->rsp([](const std::string& data) {
        })
        ->call();
  };
  client.on_close = [] {
  };
  client.open("localhost", PORT);
  client.run();
  • Server Discovery
  // receiver
  asio::io_context context;
  server_discovery::receiver receiver(context, [](const std::string& name, const std::string& message) {
    printf("receive: name: %s, message: %s\n", name.c_str(), message.c_str());
  });
  context.run();
  // sender
  asio::io_context context;
  server_discovery::sender sender_ip(context, "ip", "message");
  context.run();

Links

  • RPC library for MCU

    most MCU not support asio, there is a library can be ported easily: esp_rpc

你可能感兴趣的:(udp,网络,asio,tcp,rpc)