我必须通过 TCP 从一台计算机向另一台计算机发送网格数据...这些网格可能相当大。我很难思考通过 TCP 发送它们的最佳方式是什么,因为我对网络编程知之甚少。
这是我需要放入缓冲区以通过 TCP 发送的基本类结构:
class PrimitiveCollection
{
std::vector<Primitive*> primitives;
};
class Primitive
{
PRIMTYPES primType; // PRIMTYPES is just an enum with values for fan, strip, etc...
unsigned int numVertices;
std::vector<Vertex*> vertices;
};
class Vertex
{
float X;
float Y;
float Z;
float XNormal;
float ZNormal;
};
我正在使用 Boost 库和他们的 TCP 东西……它相当容易使用。您可以只填充一个缓冲区并通过 TCP 将其发送出去。
但是,这个缓冲区当然只能这么大,我最多可以发送 2 兆字节的数据。
那么将上述类结构放入所需缓冲区并通过网络发送的最佳方法是什么?我还需要在接收端反序列化。
在此方面的任何指导将不胜感激。
编辑: 再次阅读后我意识到这确实是一个更普遍的问题,并非特定于 Boost...它更多的是数据分 block 和发送的问题。不过,我仍然有兴趣看看 Boost 是否有任何东西可以将其抽象出来。
最佳答案
你试过Boost的TCP吗?我不明白为什么 2MB 会成为传输问题。我假设我们正在谈论一个以 100mbps 或 1gbps 运行的 LAN,一台具有大量 RAM 的计算机,并且不必具有 > 20ms 的响应时间?如果您的目标是将所有 2MB 从一台计算机发送到另一台计算机,只需发送它,TCP 会为您处理分 block 。
我有一个用 Boost 编写的 TCP 延迟检查工具,它尝试发送各种大小的缓冲区,我经常检查最多 20MB,这些似乎没有问题。
我想我想说的是,除非您知道自己有问题,否则不要花时间开发解决方案:-)
--------解决方案实现--------
现在我已经有几分钟的时间了,我仔细检查并快速实现了您所说的内容:https://github.com/teeks99/data-chunker主要分为三部分:
序列化器/反序列化器,boost 有自己的,但它并不比自己动手好多少,所以我做了。
发送方 - 通过 TCP 连接到接收方并发送数据
Receiver - 等待来自发送方的连接并解包它接收到的数据。
我在 zip 中包含了 .exe,运行 Sender.exe/Receiver.exe --help 查看选项,或者只查看 main。
更详细的解释: 打开两个命令提示符,并在其中转到 DataChunker\Debug。 在其中一个中运行 Receiver.exe 在另一台计算机上运行 Sender.exe(可能在不同的计算机上,在这种情况下,如果您想尝试多次发送,请在可执行文件名称后添加 --remote-host=IP.ADD.RE.SS 和 --num -sends=10 发送十次)。 查看代码,您可以看到发生了什么,在 respecitve main() 函数中创建 TCP 套接字的接收端和发送端。发送方创建一个新的 PrimitiveCollection 并用一些示例数据填充它,然后序列化并发送它......接收方将数据反序列化为一个新的 PrimitiveCollection,此时原始集合可以被其他人使用,但我只是写了到控制台,它已完成。
编辑:将示例移至 github。
关于c++ - 通过 Boost TCP 发送大量数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1598742/