jack06215

[Boost] Socket io

Jul 8th, 2020 (edited)
326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <boost/asio.hpp>
  4. #include <boost/thread.hpp>
  5. #include <boost/make_shared.hpp>
  6. #include <algorithm>
  7.  
  8.  
  9. using namespace std;
  10.  
  11. std::vector<boost::shared_ptr<boost::asio::ip::tcp::socket> > established_connections;
  12.  
  13. /// <summary>
  14. /// Removes socket from <vector> established_connections before close()
  15. /// </summary>
  16.  
  17.  
  18. void removeSocket(boost::shared_ptr<boost::asio::ip::tcp::socket> socket)
  19. {
  20.     established_connections.erase(std::remove(established_connections.begin(), established_connections.end(), socket), established_connections.end());
  21.     (*socket).close();
  22. }
  23.  
  24. /// <summary>
  25. /// Worker method to handle each independent socket from listener_loop.
  26. /// This method handles all communication data between the hardware sensors within the Raspberry Pi
  27. ///
  28. /// TO-DO: implement and include all hardware sensors into this method + header file to include all the sensor classes
  29. /// </summary>
  30.  
  31. void worker(boost::shared_ptr<boost::asio::ip::tcp::socket> socket)
  32. {
  33.     try
  34.     {
  35.         for (;;)
  36.         {
  37.  
  38.             char data_in[100];
  39.             boost::system::error_code error;
  40.             size_t length = (*socket).read_some(boost::asio::buffer(data_in), error);
  41.             string connections;
  42.             if (error == boost::asio::error::eof)
  43.             {
  44.                 break; // Connection closed by user
  45.             }
  46.             else if (error)
  47.             {
  48.                 throw boost::system::system_error(error); // Give some error message (DONALD: need to handle this error back to SCADA)
  49.             }
  50.  
  51.             std::string sdata_in(data_in);
  52.  
  53.             std::string message = "unknown\n";
  54.  
  55.             if (sdata_in == "temperature")
  56.             {
  57.                 message = "temperature\n";
  58.             }
  59.  
  60.             if (sdata_in == "ambiance")
  61.             {
  62.                 message = "ambiance\n";
  63.             }
  64.  
  65.             if (sdata_in == "sound")
  66.             {
  67.                 message = "sound\n";
  68.             }
  69.  
  70.             if (sdata_in == "humidity")
  71.             {
  72.                 message = "humidity\n";
  73.             }
  74.  
  75.             if (sdata_in == "dust")
  76.             {
  77.                 message = "dust\n";
  78.             }
  79.  
  80.             boost::asio::write(*socket, boost::asio::buffer(message));
  81.  
  82.         }
  83.  
  84.         removeSocket(socket);
  85.     }
  86.     catch (std::exception& e)
  87.     {
  88.         //std::cerr << "Exception: " << e.what() << std::endl;
  89.         removeSocket(socket);
  90.     }
  91. }
  92.  
  93. /// <summary>
  94. /// Creates a TCP listener based on the input port number value from main().
  95. /// Manages multiple socket connections via a vector<shared_ptr<sockets> >
  96. ///
  97. /// TO-DO: clean up vector on closing workerThread2
  98. /// </summary>
  99.  
  100. void listener_loop(int port_number)
  101. {
  102.  
  103.     boost::asio::io_service io_service;
  104.     boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), port_number);
  105.     boost::asio::ip::tcp::acceptor acceptor(io_service, endpoint);
  106.  
  107.  
  108.     while (true)
  109.     {
  110.         try
  111.         {
  112.  
  113.             boost::shared_ptr<boost::asio::ip::tcp::socket> socket = boost::make_shared<boost::asio::ip::tcp::socket>((io_service));
  114.             established_connections.push_back(socket);
  115.             std::cout << "TCP server ready and listening ... " << std::endl;
  116.             acceptor.accept(*established_connections.back());
  117.             std::cout << established_connections.size() << std::endl;
  118.  
  119.             boost::thread workerThread2(worker, established_connections.back());
  120.  
  121.         }
  122.         catch (std::exception& e)
  123.         {
  124.             std::cerr << "Exception: " << e.what() << std::endl;
  125.         }
  126.     }
  127. }
  128.  
  129. /// <summary>
  130. /// Runs the TCP listener loop to handle connections
  131. /// Input argument: Port number
  132. /// </summary>
  133.  
  134. int main(int argc, char* argv[])
  135. {
  136.     if (argc != 2)
  137.     {
  138.         std::cerr << "Usage: TCP_echo_server <port>\n";
  139.         return -1;
  140.     }
  141.  
  142.     boost::thread workerThread(listener_loop, std::atoi(argv[1])); // Creates a thread that loops to accept sockets
  143.  
  144.     workerThread.join();
  145.  
  146.     return 0;
  147. }
Add Comment
Please, Sign In to add comment