我正在尝试使用 POCO::Net 通过网络将一些对象从一个程序发送到另一个程序来处理连接,并使用谷物来处理序列化。
所有数据包都继承自单个基础 BasePacket。
class BasePacket {};
typedef std::shared_ptr<BasePacket> BasePacketPtr;
这就是我发送数据的方式:
Poco::Net::StreamSocket &socket; //passed as an argument
Poco::Net::SocketOutputStream os(socket);
while (!sendQueue.empty()) {
BasePacketPtr v;
v = sendQueue.front();
{ //block to make sure that cereal flushes everything
cereal::BinaryOutputArchive oa(os);
oa << v;
}
sendQueue.pop();
}
os.flush();
这就是我接收数据的方式:
Poco::Net::StreamSocket &socket; //passed as an argument
Poco::Net::SocketInputStream is(socket);
cereal::BinaryInputArchive ia(is);
BasePacketPtr v;
while(socket.available()) {
ia >> v;
//do sth with v...
}
问题是当数据发送非常快时,许多数据包可能在套接字缓冲区中等待,并且谷物读取所有字节,但仅反序列化第一个数据包而其余数据包丢失。
有没有办法让谷物当时只读取一个数据包或反序列化多个数据包?或者我应该在 Poco 的 socketstream 和谷物的存档之间建立某种缓冲区来发送数据大小,以便它可以在将一个数据包传递给谷物之前同时读取一个数据包?