mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-10-31 07:01:43 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #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));
 | |
| 
 | |
|     io_context.run();
 | |
| } |