以下是使用独立的 asio
库(无需依赖 Boost)实现的 UDP 客户端示例代码。该客户端可以向指定的 UDP 服务器发送消息,并接收服务器的响应。
#include <iostream>
#include <asio.hpp>
#include <asio/ip/udp.hpp>
#include <string>
#include <array>class UdpClient {
public:UdpClient(asio::io_context& io_context, const std::string& server_ip, const std::string& server_port): socket_(io_context), resolver_(io_context) {// 创建查询对象asio::ip::udp::resolver::query query(asio::ip::udp::v4(), server_ip, server_port);// 解析服务器地址和端口,获取端点信息auto endpoints = resolver_.resolve(query);// 选择第一个解析结果作为目标端点receiver_endpoint_ = *endpoints.begin();// 打开 UDP 套接字socket_.open(asio::ip::udp::v4());}void sendMessage(const std::string& message) {// 发送消息到服务器socket_.send_to(asio::buffer(message), receiver_endpoint_);}std::string receiveMessage() {std::array<char, 1024> buffer;asio::ip::udp::endpoint sender_endpoint;// 接收服务器的响应size_t length = socket_.receive_from(asio::buffer(buffer), sender_endpoint);return std::string(buffer.data(), length);}private:asio::ip::udp::socket socket_;asio::ip::udp::resolver resolver_;asio::ip::udp::endpoint receiver_endpoint_;
};int main() {try {asio::io_context io_context;// 创建 UDP 客户端,连接到本地 127.0.0.1 的 12345 端口UdpClient client(io_context, "127.0.0.1", "12345");// 要发送的消息std::string message = "Hello, UDP Server!";client.sendMessage(message);// 接收服务器的响应std::string response = client.receiveMessage();std::cout << "Received from server: " << response << std::endl;} catch (const std::exception& e) {std::cerr << "Exception: " << e.what() << std::endl;}return 0;
}
代码说明
UdpClient
类
- 构造函数:
- 接收
asio::io_context
对象、服务器 IP 地址和端口号作为参数。 - 创建
asio::ip::udp::resolver::query
对象,用于解析服务器地址和端口。 - 调用
resolver_.resolve(query)
进行解析,获取服务器端点信息。 - 选择第一个解析结果作为目标端点
receiver_endpoint_
。 - 打开 UDP 套接字。
- 接收
sendMessage
方法:- 接收一个
std::string
类型的消息,将其转换为asio::buffer
并发送到服务器端点。
- 接收一个
receiveMessage
方法:- 创建一个
std::array
作为接收缓冲区。 - 调用
socket_.receive_from
接收服务器的响应,并记录发送方的端点信息。 - 将接收到的数据转换为
std::string
并返回。
- 创建一个
main
函数
- 创建
asio::io_context
对象。 - 创建
UdpClient
实例,连接到本地127.0.0.1
的12345
端口。 - 定义要发送的消息并调用
sendMessage
方法发送。 - 调用
receiveMessage
方法接收服务器的响应并输出。 - 使用
try-catch
块捕获并处理可能的异常。
编译和运行
假设使用 g++
编译器,编译命令如下:
g++ -std=c++17 -o udp_client udp_client.cpp -lpthread
运行程序:
./udp_client
请确保有一个 UDP 服务器在 127.0.0.1
的 12345
端口监听,以便客户端能够正常通信。