mirror of
				https://github.com/espressif/esp-protocols.git
				synced 2025-10-30 22:21:39 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
 | |
|  *
 | |
|  * SPDX-License-Identifier: Unlicense OR CC0-1.0
 | |
|  */
 | |
| #include "asio.hpp"
 | |
| #include <string>
 | |
| #include <iostream>
 | |
| #include "protocol_examples_common.h"
 | |
| #include "esp_event.h"
 | |
| #include "nvs_flash.h"
 | |
| 
 | |
| using asio::ip::tcp;
 | |
| 
 | |
| class session
 | |
|     : public std::enable_shared_from_this<session> {
 | |
| public:
 | |
|     session(tcp::socket socket)
 | |
|         : socket_(std::move(socket))
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     void start()
 | |
|     {
 | |
|         do_read();
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     void do_read()
 | |
|     {
 | |
|         auto self(shared_from_this());
 | |
|         socket_.async_read_some(asio::buffer(data_, max_length),
 | |
|         [this, self](std::error_code ec, std::size_t length) {
 | |
|             if (!ec) {
 | |
|                 data_[length] = 0;
 | |
|                 std::cout << data_ << std::endl;
 | |
|                 do_write(length);
 | |
|             }
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     void do_write(std::size_t length)
 | |
|     {
 | |
|         auto self(shared_from_this());
 | |
|         asio::async_write(socket_, asio::buffer(data_, length),
 | |
|         [this, self](std::error_code ec, std::size_t length) {
 | |
|             if (!ec) {
 | |
|                 do_read();
 | |
|             }
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     tcp::socket socket_;
 | |
|     enum { max_length = 1024 };
 | |
|     char data_[max_length];
 | |
| };
 | |
| 
 | |
| class server {
 | |
| public:
 | |
|     server(asio::io_context &io_context, short port)
 | |
|         : acceptor_(io_context, tcp::endpoint(tcp::v4(), port))
 | |
|     {
 | |
|         do_accept();
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     void do_accept()
 | |
|     {
 | |
|         acceptor_.async_accept(
 | |
|         [this](std::error_code ec, tcp::socket socket) {
 | |
|             if (!ec) {
 | |
|                 std::make_shared<session>(std::move(socket))->start();
 | |
|             }
 | |
| 
 | |
|             do_accept();
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     tcp::acceptor acceptor_;
 | |
| };
 | |
| 
 | |
| 
 | |
| extern "C" void app_main(void)
 | |
| {
 | |
|     ESP_ERROR_CHECK(nvs_flash_init());
 | |
|     esp_netif_init();
 | |
|     ESP_ERROR_CHECK(esp_event_loop_create_default());
 | |
| 
 | |
|     /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.
 | |
|      * Read "Establishing Wi-Fi or Ethernet Connection" section in
 | |
|      * examples/protocols/README.md for more information about this function.
 | |
|      */
 | |
|     ESP_ERROR_CHECK(example_connect());
 | |
| 
 | |
|     /* This helper function configures blocking UART I/O */
 | |
|     ESP_ERROR_CHECK(example_configure_stdin_stdout());
 | |
| 
 | |
|     asio::io_context io_context;
 | |
| 
 | |
|     server s(io_context, std::atoi(CONFIG_EXAMPLE_PORT));
 | |
| 
 | |
|     std::cout << "ASIO engine is up and running" << std::endl;
 | |
| 
 | |
|     io_context.run();
 | |
| }
 |