首页 > 编程语言 >在C++中实现多线程异步TCP消息发送

在C++中实现多线程异步TCP消息发送

时间:2023-08-17 18:00:49浏览次数:41  
标签:std asio service C++ TCP io tcp 多线程 boost

本文主要解释了在C++中如何实现一个多线程,异步发送TCP消息的系统。我们将会用到C++的标准库和Boost.Asio库。

在C++中实现多线程异步TCP消息发送_服务器

基础知识

TCP(Transmission Control Protocol): 是一种面向连接的、可靠的、基于字节流的通信协议。它在两个网络节点之间创建一个稳定的连接,以便可以交换字节流。

多线程编程: 是一种使用多个线程并行执行代码的方法,适用于CPU密集型或IO密集型任务。

异步消息发送: 消息发送者不需要等待接收者处理消息,可以立即返回并继续执行其它任务。

Boost.Asio: 是一个跨平台C++库,用于编写使用I/O,定时器,序列化和网络编程的高性能异步应用程序。

开始实现

首先,我们需要包含必要的头文件。

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

然后,我们创建一个tcp_client类,该类用于发送TCP消息。

class tcp_client
{
public:
    tcp_client(boost::asio::io_service& io_service, const std::string& server, const std::string& message)
        : socket_(io_service), message_(message)
    {
        // Resolve the server address and port number
        boost::asio::ip::tcp::resolver resolver(io_service);
        boost::asio::ip::tcp::resolver::query query(server, "daytime");
        boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

        // Connect the socket to the server
        boost::asio::connect(socket_, endpoint_iterator);

        // Start the asynchronous operation
        start_send();
    }

    void start_send()
    {
        boost::asio::async_write(socket_, boost::asio::buffer(message_),
            [this](boost::system::error_code ec, std::size_t /*length*/)
            {
                if (!ec)
                {
                    std::cout << "Message sent successfully.\n";
                }
                else
                {
                    std::cout << "Failed to send message: " << ec.message() << "\n";
                }
            });
    }

private:
    boost::asio::ip::tcp::socket socket_;
    std::string message_;
};

tcp_client类说明

在这个tcp_client类中,我们有以下函数:

  • tcp_client: 构造函数,接受一个io_service引用,服务器的地址和需要发送的消息。它解析服务器地址和端口号,然后连接到服务器,并启动异步操作。
  • start_send: 它使用boost::asio::async_write函数异步地向服务器发送消息。一旦消息发送完毕,Boost.Asio将调用我们提供的lambda函数,此函数接收一个错误码和发送的字节长度作为参数。如果发送成功,我们就打印一条成功消息,否则,打印出错信息。

现在,我们可以在main函数中创建一个io_service对象和一个tcp_client对象,并调用io_service的run函数来开始异步操作。

int main()
{
    try
    {
        boost::asio::io_service io_service;

        // Create a list of messages to be sent.
        std::vector<std::string> messages = {"Hello", "from", "C++"};

        // Create a new thread for each message to be sent.
        std::vector<std::thread> threads;
        for (const auto& message : messages)
        {
            threads.push_back(std::thread([&io_service, &message](){
                tcp_client c(io_service, "localhost", message); 
            }));
        }

        // Run the io_service in the main thread to handle all asynchronous operations.
        io_service.run();

        // Wait for all threads to finish.
        for (auto& t : threads)
        {
            t.join();
        }
    }
    catch (std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }

    return 0;
}

在这段程序中,我们为每个要发送的消息创建了一个新的线程,并在每个线程中创建一个tcp_client对象。然后,我们在主线程中运行io_service.run函数,来处理所有的异步操作。最后,我们等待所有的线程完成。

结束语

这就是在C++中实现多线程异步发送TCP消息的简单示例。这是一个基础的示例,实际使用时可能需要添加错误处理和异常处理代码。

标签:std,asio,service,C++,TCP,io,tcp,多线程,boost
From: https://blog.51cto.com/tangming/7126257

相关文章

  • 通过 TCPView 还发现个流氓 KPKIService.exe 删掉
    叫统一安全中间件,就是个第三方做的key的安全检查,谁知道是哪年装的资料https://baijiahao.baidu.com/s?id=1717384219148345375&wfr=spider&for=pc......
  • c/c++ 程序错误记录
     //返回类型为int,正常执行代码就会没有返回值,引起段错误inttest(int**a)//错误,引起段错误,且没有打印输出信息。{try{    *a=newint[10];  }catch(constchar*msg){    fprintf(stderr,"%s",msg);    return-1;  }}......
  • 有关C++哈希函数的常用形式,具体解释见注释
    #pragmaonce#include<unordered_set>#include<unordered_map>namespacehash_function{ //将参数传入 template<typename...Types> inlinesize_thash_val(constTypes&...args){ size_tseed=0; hash_val(seed,args...); returnseed;......
  • 爬虫速度翻倍!多线程技术助你提升批量爬虫采集效率
       今天要和大家分享一些关于如何利用多线程技术提升批量爬虫采集效率的实用技巧。如果你也在面对大量数据采集任务的时候疲于奔命,那么这些经验对你来说将非常有帮助。废话不多说,让我们开始吧!1.多线程是什么?——理解多线程的概念多线程是指在一个程序中同时运行多个......
  • 9.1 C++ STL 排序、算数与集合
    C++STL(StandardTemplateLibrary)是C++标准库中的一个重要组成部分,提供了丰富的模板函数和容器,用于处理各种数据结构和算法。在STL中,排序、算数和集合算法是常用的功能,可以帮助我们对数据进行排序、统计、查找以及集合操作等。STL提供的这些算法,能够满足各种数据处理和分析的需求......
  • 10.1 C++ STL 模板适配与迭代器
    STL(StandardTemplateLibrary)标准模板库提供了模板适配器和迭代器等重要概念,为开发者提供了高效、灵活和方便的编程工具。模板适配器是指一组模板类或函数,它们提供一种适配机制,使得现有的模板能够适应新的需求。而迭代器则是STL中的令一种重要的概念,它是一个抽象化的数据访问机制,......
  • 11.1 C++ STL 应用字典与列表
    C++STL标准模板库提供了丰富的容器和算法,这些模板可以灵活组合使用,以满足不同场景下的需求。本章内容将对前面学习的知识进行总结,并重点讲解如何灵活使用STL中的vector和map容器,以及如何结合不同的算法进行组合。通过灵活组合使用这些容器和算法,能够满足不同场景下的需求,实现高......
  • 9.1 C++ STL 排序、算数与集合
    C++STL(StandardTemplateLibrary)是C++标准库中的一个重要组成部分,提供了丰富的模板函数和容器,用于处理各种数据结构和算法。在STL中,排序、算数和集合算法是常用的功能,可以帮助我们对数据进行排序、统计、查找以及集合操作等。STL提供的这些算法,能够满足各种数据处理和分析的需......
  • 11.1 C++ STL 应用字典与列表
    C++STL标准模板库提供了丰富的容器和算法,这些模板可以灵活组合使用,以满足不同场景下的需求。本章内容将对前面学习的知识进行总结,并重点讲解如何灵活使用STL中的vector和map容器,以及如何结合不同的算法进行组合。通过灵活组合使用这些容器和算法,能够满足不同场景下的需求,实现高......
  • tcp bbr v3
    目前google发布了tcpbbrv2+fixbug===tcpbbrv3 ......