C++ boost::asio编程-异步TCP详解及实例代码

下面我将详细介绍一下“C++ boost::asio编程-异步TCP详解及实例代码”的完整攻略,包括相关知识点和两个示例说明。

一、boost::asio异步编程基础

1.1 异步和同步

  • 同步:调用函数后程序会等待函数返回结果后再执行下一步操作。
  • 异步:调用函数后程序不会等待函数返回结果,而是立即执行下一步操作。函数的返回结果则由另一个线程或者回调函数处理并通知调用者。

1.2 boost::asio库

boost::asio是一个跨平台的C++库,用于实现高效的网络编程。它提供了异步I/O操作、网络协议、定时器、序列化和其他常用工具,方便用户在C++中实现高效的网络编程。

在使用boost::asio进行网络编程时,需要掌握以下几个概念:

  • io_context:是一个消息队列,用于处理I/O事件和任务。boost::asio的所有异步操作都依赖于io_context对象。
  • socket:是一个操作系统提供的基本概念,用于在网络中传输数据。boost::asio中的socket类封装了系统的socket。
  • endpoint:定义了socket的网络地址,包括IP地址和端口号。
  • buffer:用于存储数据的缓冲区。boost::asio中提供了多种缓冲区类型,例如mutable_buffer和const_buffer。

二、异步TCP编程实例

下面通过两个示例来说明如何使用boost::asio实现异步TCP编程。

2.1 示例一:异步TCP客户端

异步TCP客户端的主要实现步骤如下:

  1. 创建一个io_context对象。
boost::asio::io_context io_context;
  1. 创建一个TCP socket并连接服务器端。连接操作是异步的,连接成功或失败都会通过回调函数通知代码。
boost::asio::ip::tcp::socket socket(io_context);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::make_address("127.0.0.1"), 5555);
socket.async_connect(endpoint, [&](const boost::system::error_code& error) {
    if (!error) {
        std::cout << "Connected to server" << std::endl;
    } else {
        std::cout << "Connect failed: " << error.message() << std::endl;
    }
});
  1. 向服务器端发送数据。发送数据也是异步的操作,操作结果通过回调函数返回。
std::string message = "Hello, world!";
boost::asio::async_write(socket, boost::asio::buffer(message), [&](const boost::system::error_code& error, std::size_t bytes_transferred) {
    if (!error) {
        std::cout << "Sent " << bytes_transferred << " bytes" << std::endl;
    } else {
        std::cout << "Send failed: " << error.message() << std::endl;
    }
});

完整的异步TCP客户端示例代码如下:

#include <iostream>
#include <boost/asio.hpp>

int main() {
    boost::asio::io_context io_context;

    boost::asio::ip::tcp::socket socket(io_context);
    boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::make_address("127.0.0.1"), 5555);
    socket.async_connect(endpoint, [&](const boost::system::error_code& error) {
        if (!error) {
            std::cout << "Connected to server" << std::endl;

            std::string message = "Hello, world!";
            boost::asio::async_write(socket, boost::asio::buffer(message), [&](const boost::system::error_code& error, std::size_t bytes_transferred) {
                if (!error) {
                    std::cout << "Sent " << bytes_transferred << " bytes" << std::endl;
                } else {
                    std::cout << "Send failed: " << error.message() << std::endl;
                }

                socket.close();
                io_context.stop();
            });
        } else {
            std::cout << "Connect failed: " << error.message() << std::endl;
            io_context.stop();
        }
    });

    io_context.run();

    return 0;
}

2.2 示例二:异步TCP服务器

异步TCP服务器的主要实现步骤如下:

  1. 创建一个io_context对象和TCP监听器。
boost::asio::io_context io_context;
boost::asio::ip::tcp::acceptor acceptor(io_context, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 5555));
  1. 在acceptor上异步等待连接。连接成功或失败都会通过回调函数通知代码。
boost::asio::ip::tcp::socket socket(io_context);
acceptor.async_accept(socket, [&](const boost::system::error_code& error) {
    if (!error) {
        std::cout << "Accepted new connection" << std::endl;
    } else {
        std::cout << "Accept failed: " << error.message() << std::endl;
    }
});
  1. 从socket读取数据。socket是异步的,读取操作结果通过回调函数返回。
std::vector<char> buffer(1024);
socket.async_read_some(boost::asio::buffer(buffer), [&](const boost::system::error_code& error, std::size_t bytes_transferred) {
    if (!error) {
        std::cout << "Received " << bytes_transferred << " bytes: " << std::string(buffer.data(), bytes_transferred) << std::endl;
    } else {
        std::cout << "Read failed: " << error.message() << std::endl;
    }

    socket.close();
    io_context.stop();
});

完整的异步TCP服务器示例代码如下:

#include <iostream>
#include <vector>
#include <boost/asio.hpp>

int main() {
    boost::asio::io_context io_context;
    boost::asio::ip::tcp::acceptor acceptor(io_context, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 5555));

    boost::asio::ip::tcp::socket socket(io_context);
    acceptor.async_accept(socket, [&](const boost::system::error_code& error) {
        if (!error) {
            std::cout << "Accepted new connection" << std::endl;

            std::vector<char> buffer(1024);
            socket.async_read_some(boost::asio::buffer(buffer), [&](const boost::system::error_code& error, std::size_t bytes_transferred) {
                if (!error) {
                    std::cout << "Received " << bytes_transferred << " bytes: " << std::string(buffer.data(), bytes_transferred) << std::endl;
                } else {
                    std::cout << "Read failed: " << error.message() << std::endl;
                }

                socket.close();
                io_context.stop();
            });
        } else {
            std::cout << "Accept failed: " << error.message() << std::endl;
            io_context.stop();
        }
    });

    io_context.run();

    return 0;
}

以上就是boost::asio异步TCP编程的完整攻略和两个示例说明,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ boost::asio编程-异步TCP详解及实例代码 - Python技术站

(1)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言实现系统关机注销功能

    实现C语言的系统关机和注销功能可以通过Windows API函数实现。在Windows平台下,可以使用ExitWindowsEx函数实现关机操作,使用LockWorkStation函数实现注销操作。 下面是实现关机功能的完整攻略: 在代码中包含Windows.h头文件,这个头文件包含了Windows API函数的定义。 #include <Window…

    C 2023年5月23日
    00
  • 用VC++6.0的控制台实现2048小游戏的程序

    实现2048小游戏的步骤如下: 步骤1:建立控制台项目 打开VC++6.0,从主菜单栏中选择”File -> New”。 在弹出的”New”窗口中选择”Win32 Console Application”,并输入工程名,点击”OK”。 在下一步中,选择”Empty Project”,然后点击”Finish”。 步骤2:编写主函数 打开main.cpp文…

    C 2023年5月23日
    00
  • Win11怎么修改c盘用户名?Win11更改C盘user用户名教程

    下面我为您详细讲解“Win11怎么修改C盘用户名?Win11更改C盘user用户名教程”。 在Win11中,更改C盘的用户名可以通过以下步骤实现: 第一步:打开计算机管理 右键点击“此电脑”图标,选择“管理” 或者按下“Win+X”,选择“计算机管理” 第二步:编辑本地用户和组 展开“本地用户和组” 选择“用户” 在右侧窗口中,找到您要修改的用户名,右键点击…

    C 2023年5月23日
    00
  • C语言代码实现简单扫雷小游戏

    下面我会详细讲解“C语言代码实现简单扫雷小游戏”的完整攻略。 1. 游戏规则 扫雷是一款益智小游戏,其主要规则如下: 游戏区域是一个由方块组成的网格,每个方块是未被挖开的地雷、数字或空白格子。 玩家需要通过揭示方块,来确定地雷的位置。 如果玩家揭示的方块是地雷,游戏失败。 如果玩家揭示的方块是数字,表示周围八个方块中地雷的数量。 如果玩家揭示的方块是空白格子…

    C 2023年5月22日
    00
  • 微星4GB显存GTX 1050Ti游戏本深度图解评测+拆解图

    微星4GB显存GTX 1050Ti游戏本深度图解评测+拆解图攻略 1. 产品介绍 微星4GB显存GTX 1050Ti游戏本是一款性能出色、适合玩游戏的笔记本电脑。它配备了Intel i7-7700HQ四核处理器,拥有256GB固态硬盘和1TB机械硬盘,显卡是 NVIDIA GeForce GTX 1050Ti,而且内存为16GB DDR4。此外,它配有15.…

    C 2023年5月22日
    00
  • 你可能不知道的JSON.stringify()详解

    你可能不知道的JSON.stringify()详解 简介 JSON.stringify() 是 JavaScript 内置的一个可将对象转换为 JSON 字符串的方法。它将对象序列化为一个字符串,以便于存储或传输。JSON.stringify() 还可以接受一个函数作为第二个参数,用于控制转换过程。 JSON.stringify() 的参数 JSON.str…

    C 2023年5月23日
    00
  • c++ 内联函数和普通函数的区别

    C++中内联函数和普通函数都是函数的两种实现方式。内联函数是C++特有的一种函数实现方式,主要把函数的内容直接嵌入到调用语句中,而不是像普通函数那样调用函数。 内联函数和普通函数的区别 内联函数的调用时间和执行时间比普通函数更快。这是因为内联函数会把函数的内容嵌入到调用语句中,避免了函数调用的开销。而普通函数调用则需要跳转到函数执行的地址去执行。这样一来,在…

    C 2023年5月22日
    00
  • 使用SpringBoot的CommandLineRunner遇到的坑及解决

    使用Spring Boot的CommandLineRunner接口可以在应用程序启动时运行一些代码。但是在使用CommandLineRunner时,可能会遇到一些坑,下面是攻略及相应示例: 坑点及解决方案 1. CommandLineRunner执行顺序问题 在项目中可能会有多个CommandLineRunner实现类,SpringBoot在执行Comman…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部