0

全二重 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 でブロックさ
ますboost::asio::ip::tcp::iostream
Q2 , ミッションを達成するのに十分でない場合boost::asio::ip::tcp::iostream、他に何を使用すればよいですか? 双方向モードがあるの
を見ました。boost::iostreamそれは私が探しているものですか?私は慣れてboost::iostreamいないので、それが実際に何をするのかわかりません。も失敗した場合、の非同期操作を使用する必要があり
ますか? 私が望むのは、ソケットを実際にストリームのように動作させることであり、非同期操作をラップするのは難しいかもしれません。boost::iostreamboost::asio

追加:私が望むSocketStreamのは、読み取り時にブロックしている間に書き込みできることです。つまり、ストリームは全二重です。

アドバイスをいただければ幸いです。

4

1 に答える 1

1

クラスのインスタンスはboost::asioスレッドセーフではありません (io_service は例外です)。boost::asio::ip::tcp::iostreamしたがって、2 つのスレッドで の単一のインスタンスを使用することはできません。

このタスクを実行するには、この読み取りがブロックされているため、非同期操作と追加のスレッドを使用してstdinを読み取ることをお勧めします。そのため、 stdin からgetlineを実行し、 asio::writeをピアに送信するスレッドの 1 つです。async_read_untilで動作する他のスレッドが受信されるまで読み取り\r\nます。また、サーバーは複数のピアでは動作しないようです。そのため、async_acceptを使用してこれに対処できます。

于 2013-07-06T06:01:04.237 に答える