7 changed files with 144 additions and 112 deletions
@ -0,0 +1,74 @@ |
|||||
|
// See LICENSE for license details.
|
||||
|
|
||||
|
#include "socketif.h" |
||||
|
|
||||
|
#ifdef HAVE_BOOST_ASIO |
||||
|
|
||||
|
#include <iostream> |
||||
|
|
||||
|
socketif_t::socketif_t() |
||||
|
{ |
||||
|
try { // create socket server
|
||||
|
using boost::asio::ip::tcp; |
||||
|
io_service_ptr = new boost::asio::io_service; |
||||
|
acceptor_ptr = new tcp::acceptor(*io_service_ptr, tcp::endpoint(tcp::v4(), 0)); |
||||
|
// acceptor is created passing argument port=0, so O.S. will choose a free port
|
||||
|
std::string name = boost::asio::ip::host_name(); |
||||
|
std::cout << "Listening for debug commands on " << name.substr(0,name.find('.')) |
||||
|
<< " port " << acceptor_ptr->local_endpoint().port() << " ." << std::endl; |
||||
|
// at the end, add space and some other character for convenience of javascript .split(" ")
|
||||
|
} catch (std::exception& e) { |
||||
|
std::cerr << e.what() << std::endl; |
||||
|
exit(-1); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
socketif_t::~socketif_t() |
||||
|
{ |
||||
|
delete io_service_ptr; |
||||
|
delete acceptor_ptr; |
||||
|
} |
||||
|
|
||||
|
// read input command string
|
||||
|
std::string socketif_t::rin(std::ostream &sout_) |
||||
|
{ |
||||
|
std::string s; |
||||
|
try { |
||||
|
socket_ptr.reset(new boost::asio::ip::tcp::socket(*io_service_ptr)); |
||||
|
acceptor_ptr->accept(*socket_ptr); // wait for someone to open connection
|
||||
|
boost::asio::streambuf buf; |
||||
|
boost::asio::read_until(*socket_ptr, buf, "\n"); // wait for command
|
||||
|
s = boost::asio::buffer_cast<const char*>(buf.data()); |
||||
|
boost::erase_all(s, "\r"); // get rid off any cr and lf
|
||||
|
boost::erase_all(s, "\n"); |
||||
|
// The socket client is a web server and it appends the IP of the computer
|
||||
|
// that sent the command from its web browser.
|
||||
|
|
||||
|
// For now, erase the IP if it is there.
|
||||
|
boost::regex re(" ((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}" |
||||
|
"(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])$"); |
||||
|
s = boost::regex_replace(s, re, (std::string)""); |
||||
|
|
||||
|
// TODO: check the IP against the IP used to upload RISC-V source files
|
||||
|
} catch (std::exception& e) { |
||||
|
std::cerr << e.what() << std::endl; |
||||
|
} |
||||
|
// output goes to socket
|
||||
|
sout_.rdbuf(&bout); |
||||
|
return s; |
||||
|
} |
||||
|
|
||||
|
// write sout_ to socket (via bout)
|
||||
|
void socketif_t::wout() { |
||||
|
try { |
||||
|
boost::system::error_code ignored_error; |
||||
|
boost::asio::write(*socket_ptr, bout, boost::asio::transfer_all(), ignored_error); |
||||
|
socket_ptr->close(); // close the socket after each command input/ouput
|
||||
|
// This is need to in order to make the socket interface
|
||||
|
// acessible by HTTP GET via a socket client in a web server.
|
||||
|
} catch (std::exception& e) { |
||||
|
std::cerr << e.what() << std::endl; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,32 @@ |
|||||
|
// See LICENSE for license details.
|
||||
|
|
||||
|
#ifndef _RISCV_SOCKETIF_H |
||||
|
#define _RISCV_SOCKETIF_H |
||||
|
|
||||
|
#include "config.h" |
||||
|
|
||||
|
#ifdef HAVE_BOOST_ASIO |
||||
|
|
||||
|
#include <boost/algorithm/string.hpp> |
||||
|
#include <boost/regex.hpp> |
||||
|
#include <boost/asio.hpp> |
||||
|
|
||||
|
class socketif_t |
||||
|
{ |
||||
|
public: |
||||
|
socketif_t(); |
||||
|
~socketif_t(); |
||||
|
|
||||
|
std::string rin(std::ostream &sout_); // read input command string
|
||||
|
void wout(); // write output to socket
|
||||
|
|
||||
|
private: |
||||
|
// the following are needed for command socket interface
|
||||
|
boost::asio::io_service *io_service_ptr; |
||||
|
boost::asio::ip::tcp::acceptor *acceptor_ptr; |
||||
|
std::unique_ptr<boost::asio::ip::tcp::socket> socket_ptr; |
||||
|
boost::asio::streambuf bout; |
||||
|
}; |
||||
|
|
||||
|
#endif |
||||
|
#endif |
||||
Loading…
Reference in new issue