我希望实现全双工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
的异步操作吗? Cuz我想要的是让套接字真的像流一样,并且包装异步操作可能很困难。
附加:我希望SocketStream
可以在读取时阻止写入,这意味着该流是全双工的。
请,任何建议将不胜感激!
答案 0 :(得分:1)
boost::asio
类的实例不是线程安全的(io_service只是例外)。因此,您不能在2个线程中使用boost::asio::ip::tcp::iostream
的单个实例。
要执行此任务,我宁愿使用异步操作和其他线程来读取 stdin ,因为此读取是阻塞的。所以,其中一个线程从stdin执行 getline ,而 asio :: write 执行到对等线程。使用 async_read_until 的其他主题阅读,直到\r\n
被接收为止。此外,您的服务器似乎无法与多个同行一起使用,因此您可以使用 async_accept