Skip to content

Instantly share code, notes, and snippets.

@amidvidy
Last active August 29, 2015 14:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amidvidy/c001313dd4b9c4860246 to your computer and use it in GitHub Desktop.
Save amidvidy/c001313dd4b9c4860246 to your computer and use it in GitHub Desktop.
UDP name server
#include <string>
#include <iostream>
#include <boost/asio.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/bind.hpp>
using boost::asio::ip::udp;
namespace {
class HelloWorldServer {
public:
HelloWorldServer(boost::asio::io_service& io_service)
: _socket(io_service, udp::endpoint(udp::v4(), 1111))
{
startReceive();
}
private:
void startReceive() {
_socket.async_receive_from(
boost::asio::buffer(_recvBuffer), _remoteEndpoint,
boost::bind(&HelloWorldServer::sendWelcome, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void sendWelcome(const boost::system::error_code& error,
std::size_t bytes_transferred) {
std::string message{"Welcome. What is your name?\n"};
_socket.async_send_to(boost::asio::buffer(message), _remoteEndpoint,
boost::bind(&HelloWorldServer::getName, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void getName(const boost::system::error_code& error,
std::size_t bytes_transferred) {
if (!error || error == boost::asio::error::message_size) {
_socket.async_receive_from(boost::asio::buffer(_recvBuffer), _remoteEndpoint,
boost::bind(&HelloWorldServer::sendHello, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
}
void sendHello(const boost::system::error_code& error,
std::size_t bytes_transferred) {
if (!error || error == boost::asio::error::message_size) {
std::string name{_recvBuffer.data(), bytes_transferred};
boost::algorithm::trim(name);
auto message = "Hello, " + name + "\n";
_socket.async_send_to(boost::asio::buffer(message), _remoteEndpoint,
boost::bind(&HelloWorldServer::handleSend, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
}
void handleSend(const boost::system::error_code& ec,
std::size_t bytes_transferred) {
startReceive();
}
udp::socket _socket;
udp::endpoint _remoteEndpoint;
std::array<char, 1024> _recvBuffer;
};
} // namespace
int main() {
try {
boost::asio::io_service io_service;
HelloWorldServer server{io_service};
io_service.run();
} catch (const std::exception& ex) {
std::cerr << ex.what() << std::endl;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment