【发布时间】:2023-03-06 12:56:01
【问题描述】:
所以我有一个TCP 服务器,它在特定端口上等待客户端连接。
如果有一个客户端连接,我用一些asio::io_service 构造一个tcp::socket 对象,然后我接受那个套接字。示例:
void Gateway::server(boost::asio::io_service& io_service, unsigned short port) {
tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), port));
bool UARTToWiFiGatewayStarted = false;
for (;;) {
tcp::socket sock(io_service);
a.accept(sock);
std::thread(startWiFiToUARTSession, std::move(sock)).detach();
if(false == UARTToWiFiGatewayStarted) {
//std::thread(startUARTToWifiSession, std::move(sock2)).detach();
UARTToWiFiGatewayStarted = true;
}
}
}
现在我想在至少两个线程上使用此套接字的功能,一个线程将从套接字 (read_some(...)) 读取(阻塞)数据,而另一个线程需要使用该套接字写入(阻塞)数据。
我试图使用同一个 asio::io_service 对象构造两个 tcp::socket 对象,但这不起作用。
有什么想法吗?
【问题讨论】:
-
“行不通”是什么意思?
-
“在至少两个线程上使用这个套接字的功能”——你的意思是同一个客户端的连接?
-
每个
tcp::socket对象都应该引用一个离散的本机套接字。您能否解释一下为什么要将两个tcp::socket对象用于单个 TCP 连接? -
@TannerSansbury 我想要两个
tcp::socket指代同一个离散的本机套接字。我想要这个,因为我不能在两个线程之间共享现有的。 -
@Marius 为什么不能通过引用
shared_ptr等在两个线程之间共享单个tcp::socket对象?tcp::socket对象旨在获取本机套接字的所有权。有两个tcp::socket对象声称拥有同一个本机套接字的所有权可能会增加不必要的复杂性。
标签: c++ multithreading boost tcp boost-asio