Skip to content

Instantly share code, notes, and snippets.

@ybouhjira
Last active January 4, 2016 09:07
Show Gist options
  • Save ybouhjira/7e40d7f199fca12a1c5d to your computer and use it in GitHub Desktop.
Save ybouhjira/7e40d7f199fca12a1c5d to your computer and use it in GitHub Desktop.
Echo server
#include <cstdlib>
#include <iostream>
#include <boost/asio.hpp>
#include <functional>
using boost::asio::ip::udp;
class server
{
public:
server(boost::asio::io_service& io_service, short port)
: socket_(io_service, udp::endpoint(udp::v4(), port))
{
do_receive();
}
void do_receive() {
socket_.async_receive_from(
boost::asio::buffer(data_, max_length),
sender_endpoint_,
[this] (boost::system::error_code ec, std::size_t bytes_recvd) {
std::cout << "Received request from "
<< sender_endpoint_
.address()
.to_string()
<< std::endl;
if (!ec && bytes_recvd > 0) do_send(bytes_recvd);
else do_receive();
});
}
void do_send(std::size_t length)
{
socket_.async_send_to(
boost::asio::buffer(data_, length),
sender_endpoint_,
[this](boost::system::error_code /*ec*/, std::size_t /*bytes_sent*/) {
do_receive();
});
}
private:
udp::socket socket_;
udp::endpoint sender_endpoint_;
enum { max_length = 1024 };
char data_[max_length];
};
int main(int argc, char* argv[])
{
try {
if (argc != 2) {
std::cerr << "Usage: async_udp_echo_server <port>\n";
return 1;
}
boost::asio::io_service io_service;
server s(io_service, std::atoi(argv[1]));
io_service.run();
} catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment