Skip to content

Instantly share code, notes, and snippets.

@ngerakines
Created November 8, 2010 07:56
Show Gist options
  • Select an option

  • Save ngerakines/667463 to your computer and use it in GitHub Desktop.

Select an option

Save ngerakines/667463 to your computer and use it in GitHub Desktop.
#include <cstdlib>
#include <deque>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
using namespace std;
using boost::asio::ip::tcp;
namespace redis {
class client {
public:
client(boost::asio::io_service& io_service) : resolver_(io_service), socket_(io_service) {
tcp::resolver::query query("127.0.0.1", "6379");
std::ostream request_stream(&request_);
request_stream << "INFO\r\n";
resolver_.async_resolve(query, boost::bind(&client::handle_resolve, this, boost::asio::placeholders::error, boost::asio::placeholders::iterator));
}
void handle_resolve(const boost::system::error_code& err, tcp::resolver::iterator endpoint_iterator) {
if (!err) {
tcp::endpoint endpoint = *endpoint_iterator;
socket_.async_connect(endpoint, boost::bind(&client::handle_connect, this, boost::asio::placeholders::error, ++endpoint_iterator));
} else {
std::cout << "Error: " << err.message() << "\n";
}
}
void handle_connect(const boost::system::error_code& err, tcp::resolver::iterator endpoint_iterator) {
if (!err) {
boost::asio::async_write(socket_, request_, boost::bind(&client::handle_write_request, this, boost::asio::placeholders::error));
} else if (endpoint_iterator != tcp::resolver::iterator()) {
socket_.close();
tcp::endpoint endpoint = *endpoint_iterator;
socket_.async_connect(endpoint, boost::bind(&client::handle_connect, this, boost::asio::placeholders::error, ++endpoint_iterator));
} else {
std::cout << "Error: " << err.message() << "\n";
}
}
void handle_write_request(const boost::system::error_code& err) {
if (!err) {
boost::asio::async_read_until(socket_, response_, "\r\n", boost::bind(&client::handle_read_status_line, this, boost::asio::placeholders::error));
} else {
std::cout << "Error: " << err.message() << "\n";
}
}
void handle_read_status_line(const boost::system::error_code& err) {
std::cout << &response_;
}
tcp::resolver resolver_;
tcp::socket socket_;
boost::asio::streambuf request_;
boost::asio::streambuf response_;
};
}
int main () {
boost::asio::io_service io_service;
redis::client c(io_service);
io_service.run();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment