Daytime.4——一个同步的 UDP daytime 客户端 #
这份教程展示了如何使用asio实现一个 UDP 客户端应用。
#include <array>
#include <iostream>
#include <boost/asio.hpp>
using boost::asio::ip::udp;
该程序的启动与 TCP daytime 客户端的启动基本相同。
int main(int argc, char* argv[])
{
try
{
if (argc != 2)
{
std::cerr << "Usage: client <host>" << std::endl;
return 1;
}
boost::asio::io_context io_context;
使用 ip::udp::resolver 对象根据主机和服务名找到正确的远程连接点(endpoint)。通过 ip::udp::v4() 参数限制查询仅返回IPv4连接点。
udp::resolver resolver(io_context);
udp::endpoint receiver_endpoint =
*resolver.resolve(udp::v4(), argv[1], "daytime").begin();
ip::udp::resolver::resolve() 函数保证,如果没有失败,至少在列表中返回一个连接点。这意味着直接对返回值进行解引用是安全的。
由于UDP是面向数据报的,这里不使用流式套接字(stream socket)。这里创建一个 ip::udp::socket 并启动与远程连接点的通信。
udp::socket socket(io_context);
socket.open(udp::v4());
std::array<char, 1> send_buf = {{ 0 }};
socket.send_to(boost::asio::buffer(send_buf), receiver_endpoint);
现在需要做好准备以接收服务器发回给客户端的任何内容。客户端接收服务器响应的连接点由 ip::udp::socket::receive_from() 函数进行初始化。
std::array<char, 128> recv_buf;
udp::endpoint sender_endpoint;
size_t len = socket.receive_from(
boost::asio::buffer(recv_buf), sender_endpoint);
std::cout.write(recv_buf.data(), len);
}
最后,处理任何可能抛出的异常:
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}