我希望实现一个全双工 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
's 异步操作吗?因为我想要的是让套接字真正表现得像一个流,并且包装异步操作可能很困难。
附加:我希望SocketStream
在读取时也可以写入,这意味着流是全双工的。
请,任何建议将不胜感激!