我希望實現一個全雙工tcp流。這是一個例子。boost :: tcp :: iostream同時讀取和寫入
//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
可以被寫入,同時它也在讀取時被阻塞,這意味着該流是全雙工的。
請任何意見,將不勝感激!
此行阻止了哪一行?你可以顯示你的代碼初始化SocketStream嗎? – crowder
@crowder完成! – Immueggpain
好的,下一步:你如何啓動線程? – crowder