int main()
{
try
{
Создайте объект сервера для приема входящих запросов клиента и запустите объектio_service.
boost::asio::io_service io_service;
udp_server server(io_service);
io_service.run();
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
class udp_server
{
public:
Конструктор инициализирует розетку для прослушивания на порту 13 UDP.
udp_server(boost::asio::io_service& io_service)
: socket_(io_service, udp::endpoint(udp::v4(), 13))
{
start_receive();
}
private:
void start_receive()
{
Функцияip::udp::socket::async_receive_from()заставит приложение прослушать в фоновом режиме новый запрос. При получении такого запроса объектio_serviceвызовет функцию<handle_receive()
>с двумя аргументами: значением увеличения типа::system::error_code, указывающим, удалась или не удалась операция, и значением<size_t
><bytes_transferred
>, указывающим количество полученных байтов.
socket_.async_receive_from(
boost::asio::buffer(recv_buffer_), remote_endpoint_,
boost::bind(&udp_server::handle_receive, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
Функция<handle_receive()
>будет обслуживать клиентский запрос.
void handle_receive(const boost::system::error_code& error,
std::size_t )
{
Параметр<error
>содержит результат асинхронной операции. Поскольку мы предоставляем только 1-байт<recv_buffer_
>, чтобы содержать запрос клиента, объектio_serviceвернет ошибку, если клиент отправил что-то большее. Мы можем игнорировать такую ошибку, если она возникнет.
if (!error || error == boost::asio::error::message_size)
{
Определите, что мы собираемся отправить.
boost::shared_ptr<std::string> message(
new std::string(make_daytime_string()));
Теперь мы называемip::udp::socket::async_send_to()для передачи данных клиенту.
socket_.async_send_to(boost::asio::buffer(*message), remote_endpoint_,
boost::bind(&udp_server::handle_send, this, message,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
При запуске асинхронной операции и при использовании бустера::bind() необходимо указать только те аргументы, которые соответствуют списку параметров обработчика. В этой программе оба заполнителя аргументов (boost::asio::placeholders::error и boost:::asio::placeholders::bytes_transferred) потенциально могли быть удалены.
Начните прослушивать следующий запрос клиента.
start_receive();
Любые дальнейшие действия по этому запросу клиента теперь являются ответственностью<handle_send()
>.
}
}
Функция<handle_send()
>используется после завершения запроса на обслуживание.
void handle_send(boost::shared_ptr<std::string> ,
const boost::system::error_code& ,
std::size_t )
{
}
udp::socket socket_;
udp::endpoint remote_endpoint_;
boost::array<char, 1> recv_buffer_;
};
Полный список источников
Вернуться вучебный индекс
Daytime.5 - синхронный дневной сервер UDP
Daytime.7 - Комбинированный асинхронный сервер TCP/UDP