C ++ Boost TCP通道上的序列化对象,双向通信不起作用

Posted

技术标签:

【中文标题】C ++ Boost TCP通道上的序列化对象,双向通信不起作用【英文标题】:C++ Boost TCP serialized objects on channel, bidirectional communication does not work 【发布时间】:2010-12-07 21:29:31 【问题描述】:

我有一个班级,一个非常愚蠢的班级。此类的对象,我想通过 tcp 使用 asio by boost 发送它们。我的班级正确地与 boost 的东西建立了友谊并实现了方法序列化...

我希望客户端连接到服务器,将我的对象发送给它,然后服务器发送回同一类的另一个对象。

我尝试过这样做:

在服务器中:

Data data;
int port = 2040;
boost::asio::io_service io_s;
tcp::acceptor data_acceptor(io_s, tcp::endpoint(tcp::v4(), port));
tcp::iostream data_stream;
Data data_recv;
data_acceptor.accept(*(data_stream.rdbuf())); /* Accepting */
boost::archive::binary_iarchive ia(data_stream);
ia >> data_recv; 
boost::archive::binary_oarchive oa(data_stream); /* LINE Y */
oa << data; /* LINE X */
data_stream.close();

Data 是可序列化的类。

在客户端:

Data data_send;
Data data_recv;
tcp::iostream data_stream("127.0.0.1", "2040"); /* Creating TCP stream */
boost::archive::binary_oarchive oa(data_stream);
oa << data_send;
boost::archive::binary_iarchive ia(data_stream); /* LINE Q */
ia >> data_recv; /* Receive LINE W */
data_stream.close();

好吧,它不起作用。它以某种方式阻塞。

这是古玩,因为问题是这种双向方案,如果我消除线 Q、W、X、Y 它可以工作!!! 你知道如何解决这个问题吗?

【问题讨论】:

data在服务器中定义在哪里?我在那里只看到data_recv。我指的是第 X 行。 是的,对不起,我的复制错误...我发布了更正... 你知道客户端阻塞在Q线还是W线?服务器类似。 嗯,它似乎在 LINE Q 上阻塞,服务器也一样 【参考方案1】:

你需要在客户端调用flush on stream

oa << data_send;
data_stream.flush();

【讨论】:

以上是关于C ++ Boost TCP通道上的序列化对象,双向通信不起作用的主要内容,如果未能解决你的问题,请参考以下文章

C++ Boost.Asio - tcp 套接字异步写入

C++ Boost 序列化、构造函数和数据复制

RPC与消息队列

在 C++11 中对 boost::asio 套接字对象重复 std::move

Boost.Serialization 在不同平台上的序列化是不是不同?

在 C++Builder 中使用 boost::regex 提取双引号