【发布时间】: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,这就是为什么我要测试可能是不好的做法甚至完全不好的东西的原因。您能否指出您在我上面的代码中发现的“一堆问题”?