通过网络发送和接收<vector>数据

时间:2015-05-21 04:42:41

标签: c++ vector winsock

我有一个定义如下的向量:

std::vector<char*> rooms;
const int rows = 100;
const int columns = 10;

我需要将此向量作为字符串缓冲区发送。然后接收并将字符串转换为另一个大小相同的矢量。

这是我发送字符串的方式:

int SendData(std::string data)
{
    s.SendLine(data);

    return 0;
}

我无法想象解决方案。

3 个答案:

答案 0 :(得分:1)

既然你已经知道如何发送字符串,并且向量只是一系列字符串,那么发送向量的最简单方法就是一个接一个地发送字符串。

当然魔鬼在细节中:接收者将如何知道预期会有多少弦?接收器如何知道一个字符串的结束位置和下一个字符串的开始位置?

答案:在发送第一个字符串之前,发送一些初始数据,表明您打算发送多少个字符串。 (如果你想保持简单,这可能是一个额外的字符串,如&#34; 100&#34;接收器将知道用作提示;或者你可以发送一个整数作为一个或两个或四个字节的二进制数据,如果您喜欢这样做[请务必考虑字节序问题,如果您将其发送为多个字节])

对于接收器知道一个字符串结束和下一个字符串开始的位置,一种方法是确保在每个字符串的末尾发送一个NUL / 0字节;然后接收器可以查找该字节以了解每个字符串的结束位置。另一种方法是在发送字符串本身之前发送字符串中的字节数,然后接收者可以确保读取字符串的那么多字节。

答案 1 :(得分:0)

您说您知道如何发送std::string,并且您希望将矢量作为单个字符串发送。所以你需要的是在一个大字符串中转换字符串向量。

您可以尝试重新发明一种方式,或者只是使用(或模仿)其他人已经想到的方式:

  • 逗号分隔值
  • JS​​ON
  • XML

所有都有其优点和缺点。其中最棘手的部分是逃避特殊的角色#34;

答案 2 :(得分:0)

I need to send this vector as string buffer. And then receive and turn the string into another vector with same size.

这听起来你从数据构建字符串的解决方案是一个解决方案,你的问题就到了,你希望你的解决方案在哪里工作。但是有一种更好的方法可以在不使用手动编码的弦乐体操的情况下传输任何类型的数据。

如果您只想通过网络发送skalars,容器和自定义构建类实例等任何类型的数据,您应该考虑使用一个库来为您执行此操作,而无需一次又一次地重新发明轮子。如果是您的情况搜索serializer,您将获得所有类型数据的准备使用解决方案!

看看http://www.boost.org/doc/libs/1_58_0/libs/serialization/doc/index.htmlhttps://developers.google.com/protocol-buffers/