【问题标题】:How to properly store asio connections and reuse them? (non-boost)如何正确存储asio连接并重用它们? (非升压)
【发布时间】:2022-06-10 20:18:23
【问题描述】:

我正在尝试了解基本的 ASIO(非增强),但在理解如何存储套接字以便以后重用它们时遇到问题。我在看这篇文章:Storing boost sockets in vectors 并试图在我的代码中重新实现它:

#include <iostream>
#include <string>
#include <vector>
#include <asio.hpp>
#include <memory>

std::vector<std::shared_ptr<asio::ip::tcp::socket>> clients;

int main() {
    std::cout << "Starting server..." << "\n";

    try {
        asio::io_context io_context;
        asio::ip::tcp::acceptor acceptor(io_context, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), 6666)); /* Ports below 1025 doesn't work due to permission problem? */

        for (;;) {
            asio::ip::tcp::socket socket(io_context);
            acceptor.accept(socket);
   
            std::string message = std::to_string(clients.size());
            asio::error_code ignored_error;
            asio::write(socket, asio::buffer(message), ignored_error);

            std::shared_ptr<asio::ip::tcp::socket> newconn = std::make_shared<asio::ip::tcp::socket>(std::move(socket)); 
            clients.push_back(newconn);

            /* This does not work */
            for(auto &x : clients) {
                std::string msg = "hello";
                asio::write(x, asio::buffer(message), ignored_error);
            }

        }
        
    } catch (std::exception &e) {
        std::cerr << e.what() << std::endl;
    }

    return EXIT_SUCCESS;
}

但是用于循环客户端的代码 sn-p 似乎不起作用。是我执行不正确还是我对shared_ptr 的理解太差了?

问题:如何将 asio 套接字存储在向量中并在以后重用它们来发送消息?

【问题讨论】:

  • 您必须熟悉基本的 C++ 概念:RAII、价值性、复制与移动语法和语义、值与引用与指针语法和语义。上面的sn-p有一堆问题。但在你学习基础知识之前,纠正它们并不会阻止你在脚下开枪。
  • @Red.Wave,我同意,我没有正确理解 Asio,这就是为什么我要测试可能是不好的做法甚至完全不好的东西的原因。您能否指出您在我上面的代码中发现的“一堆问题”?

标签: c++ asio


【解决方案1】:

奇怪的是,这条线在asio::write(socket, asio::buffer(message), ignored_error); 有效,因为您在std::shared_ptr&lt;asio::ip::tcp::socket&gt; newconn = std::make_shared&lt;asio::ip::tcp::socket&gt;(std::move(socket)); 之前移动了一个套接字,后来又尝试使用它。在基于范围内,您会得到 x,它是对 shared_ptr 的引用。如果函数write 使用socket 而不是shared_ptr&lt;socket&gt;,我认为你应该使用asio::write(*x, asio::buffer(message), ignored_error);

【讨论】:

  • 你对不应该工作的行是绝对正确的。我将我的代码复制到另一个文件以使其更清晰,并且必须以某种方式对其进行重新排序。现在问题应该是正确的。
  • 正如你所说,它应该是 *x 才能使用套接字。我会建议对您的答案进行编辑,以便我们包含代码,然后我会将其标记为已接受。 :)
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
相关资源
最近更新 更多