boost :: tcp :: iostream read&同时写

时间:2013-07-05 07:10:31

标签: c++ boost boost-asio

我希望实现全双工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可以在读取时阻止写入,这意味着该流是全双工的。

请,任何建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

boost::asio类的实例不是线程安全的(io_service只是例外)。因此,您不能在2个线程中使用boost::asio::ip::tcp::iostream的单个实例。

要执行此任务,我宁愿使用异步操作和其他线程来读取 stdin ,因为此读取是阻塞的。所以,其中一个线程从stdin执行 getline ,而 asio :: write 执行到对等线程。使用 async_read_until 的其他主题阅读,直到\r\n被接收为止。此外,您的服务器似乎无法与多个同行一起使用,因此您可以使用 async_accept

处理此问题