gpt4 book ai didi

c++ - boost::tcp::iostream 同时读写

转载 作者:行者123 更新时间:2023-11-28 07:31:59 25 4
gpt4 key购买 nike

我想实现一个全双工的 TCP 流。这是一个例子。

//server.cpp

#include <SDKDDKVer.h>
#include <iostream>
using namespace std;
#include <boost/asio.hpp>
#include <boost/thread.hpp>

boost::asio::ip::tcp::iostream SocketStream;

void ThreadA()
{
for(;;)
{
std::string Line;
std::getline(SocketStream, Line); //Y
std::cout << Line << std::endl;
}
}

void ThreadB()
{
for(;;)
{
std::string Line;
std::getline(std::cin, Line); //Z
SocketStream<<Line<<std::endl; //X
}
}

int main()
{
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 4444);
boost::asio::io_service io_service;
boost::asio::ip::tcp::acceptor acceptor(io_service, endpoint);
boost::system::error_code ec;
acceptor.accept(*SocketStream.rdbuf(), ec);

boost::thread tA(ThreadA);
boost::thread tB(ThreadB);
tA.join();
tB.join();
return 0;
}

//client.cpp

#include <SDKDDKVer.h>
#include <iostream>
using namespace std;
#include <boost/asio.hpp>
#include <boost/thread.hpp>


boost::asio::ip::tcp::iostream SocketStream;

void ThreadA()
{
for(;;)
{
std::string Line;
std::getline(SocketStream, Line);
std::cout << Line << std::endl;
}
}

void ThreadB()
{
for(;;)
{
std::string Line;
std::getline(std::cin, Line);
SocketStream<<Line<<std::endl;
}
}

int main()
{
boost::system::error_code ec;
SocketStream.connect("127.0.0.1", "4444");

boost::thread tA(ThreadA);
//boost::thread tB(ThreadB);
tA.join();
//tB.join();
return 0;
}

但是它会在 X 行阻塞。
Q1,我是不是做错了什么,或者 boost::asio::ip::tcp::iostream 根本无法做到这一点?
Q2,如果boost::asio::ip::tcp::iostream不足以完成任务,我还应该使用什么?
我看到 boost::iostream 具有双向模式。这就是我要找的吗?我不熟悉 boost::iostream,所以我不确定它到底做了什么。
如果 boost::iostream 也失败了,那么我必须使用 boost::asio 的异步操作吗?因为我想要的是让套接字真正表现得像一个流,包装异步操作可能很困难。

附加:我希望 SocketStream 可以在写入时也阻塞读取,这意味着该流是全双工的。

如有任何建议,我们将不胜感激!

最佳答案

boost::asio 类的实例不是线程安全的(io_service 只是个异常(exception))。所以你不能在 2 个线程中使用 boost::asio::ip::tcp::iostream 的单个实例。

为了完成这个任务,我更愿意使用异步操作和额外的线程来读取 stdin,因为这个读取是阻塞的。因此,其中一个线程从 stdin 和 asio::write 执行 getline 到 peer。其他线程与 async_read_until 一起读取直到收到 \r\n。此外,您的服务器似乎无法与多个对等方一起工作,因此您可以使用 async_accept

来处理这个问题

关于c++ - boost::tcp::iostream 同时读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17483076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com