设计素材网站哪个好,工信部网站备案的需要幕布,网页设计汽车网站建设,世界羽联巡回赛总决赛以下是一个使用独立的 C Asio 库实现的 UDP 服务器的示例代码。这个 UDP 服务器可以监听指定端口#xff0c;接收客户端发送的数据#xff0c;并将接收到的数据原样返回给客户端。
#include iostream
#include asio.hpp
#include arrayclass UdpSer…以下是一个使用独立的 C Asio 库实现的 UDP 服务器的示例代码。这个 UDP 服务器可以监听指定端口接收客户端发送的数据并将接收到的数据原样返回给客户端。
#include iostream
#include asio.hpp
#include arrayclass UdpServer {
public:// 构造函数初始化服务器并开始接收数据UdpServer(asio::io_context io_context, short port): socket_(io_context, asio::ip::udp::endpoint(asio::ip::udp::v4(), port)) {startReceive();}private:// 开始异步接收数据的方法void startReceive() {socket_.async_receive_from(asio::buffer(data_, max_length), sender_endpoint_,[this](const asio::error_code ec, std::size_t bytes_recvd) {if (!ec bytes_recvd 0) {handleReceive(bytes_recvd);} else {startReceive();}});}// 处理接收到的数据的方法void handleReceive(std::size_t length) {std::cout Received length bytes from sender_endpoint_.address().to_string() : sender_endpoint_.port() std::endl;std::cout Message: std::string(data_.data(), length) std::endl;// 回显接收到的数据给客户端socket_.async_send_to(asio::buffer(data_, length), sender_endpoint_,[this](const asio::error_code /*ec*/, std::size_t /*bytes_sent*/) {startReceive();});}asio::ip::udp::socket socket_;asio::ip::udp::endpoint sender_endpoint_;static constexpr std::size_t max_length 1024;std::arraychar, max_length data_;
};int main() {try {// 创建 io_context 对象用于管理异步操作asio::io_context io_context;// 创建 UDP 服务器实例监听端口 12345UdpServer server(io_context, 12345);// 启动事件循环处理异步操作io_context.run();} catch (const std::exception e) {// 捕获并输出异常信息std::cerr Exception: e.what() std::endl;}return 0;
}代码解释
UdpServer 类 构造函数 接收一个 asio::io_context 对象和一个端口号作为参数。创建一个 asio::ip::udp::socket 对象并将其绑定到指定的端口使用 asio::ip::udp::endpoint。调用 startReceive 方法开始异步接收数据。 startReceive 方法 使用 socket_.async_receive_from 异步地从客户端接收数据。该方法接受一个缓冲区asio::buffer、一个存储发送方端点信息的 sender_endpoint_ 对象以及一个回调函数。当有数据到达时回调函数会被触发。如果没有错误且接收到的数据长度大于 0则调用 handleReceive 方法处理数据否则继续等待下一次接收。 handleReceive 方法 打印接收到的数据的长度、发送方的 IP 地址和端口号。使用 socket_.async_send_to 异步地将接收到的数据原样返回给客户端。在发送完成的回调函数中如果没有错误继续调用 startReceive 方法等待下一次接收如果有错误则输出错误信息并继续等待。
main 函数
创建一个 asio::io_context 对象它是 Asio 库的核心用于管理异步操作的事件循环。创建一个 UdpServer 对象指定监听的端口为 12345。调用 io_context.run() 启动事件循环开始处理异步操作。使用 try-catch 块捕获并处理可能抛出的异常。
编译和运行
要编译这个程序你可以使用以下命令假设使用 g 编译器
g -stdc17 -o udp_server udp_server.cpp -lpthread运行程序
./udp_server运行服务器后它会开始监听 12345 端口等待客户端发送数据。你可以使用网络调试工具或者编写一个 UDP 客户端程序来与这个服务器进行通信测试。