c++ vector<char> 和套接字

Posted

技术标签:

【中文标题】c++ vector<char> 和套接字【英文标题】:c++ vector<char> and sockets 【发布时间】:2009-09-09 14:03:40 【问题描述】:

有没有办法调用 send / recv 传入一个向量?

在 c++ 中缓冲套接字数据的好习惯是什么?例如:读取直到 \r\n 或直到上界(4096 字节)

【问题讨论】:

您的意思是要按原样传递整个数据结构? 代替:char b[100];发送(z,b,100,0);我想发送一个矢量。我可能在另一个线程***.com/questions/550797/… 中找到了答案,但这是一个好习惯吗? 使用第一个元素的地址就可以了。所以你可以用它来发送()。该标准保证所有元素都在连续的内存中。反过来也行不通,因为您的尺寸可能不正确。 【参考方案1】:
std::vector<char> b(100); 
send(z,&b[0],b.size(),0);

编辑:我第二个 Ben Hymers' 和 me22's cmets。此外,请参阅 this answer 以获取不尝试访问空向量中的第一个元素的通用实现。

【讨论】:

【参考方案2】:

为了扩展 sbi 所说的,std::vector 保证具有与 C 样式数组相同的内存布局。因此,您可以使用 &myVector[0],即第 0 个元素的地址作为数组的开始地址,并且可以安全地使用该数组的 myVector.size() 元素。请记住,一旦您下次修改向量,它们都会失效!

【讨论】:

为了澄清 Ben 所说的,一旦你修改了向量本身,它就失效了,而不是向量的内容。换句话说,如果你让vector重新分配它的内容,你从&v[0]返回的地址是无效的。 我不会说“相同的内存布局”,因为 sizeof(vector) 是一个常数,而是说明连续性的实际保证:对于所有 T != bool, vector v, i in [0, v.size()),你知道 &v[i] == &v[0] + i.【参考方案3】:

需要注意的一点:如果向量为空,则 &v[0] 在技术上是不允许的,并且某些实现会向您断言,因此如果您从其他人那里获取缓冲区,请确保它们在使用之前不为空把戏。

C++0x 的向量有一个 .data() 成员函数(如 std::string 的)来避免这个问题并使事情更清晰。

【讨论】:

以上是关于c++ vector<char> 和套接字的主要内容,如果未能解决你的问题,请参考以下文章

(C++)将string型vector中的元素复制到char型数组中。。出错!

c++如何将vector<char>转化成string

C++ - 将 char 引用转换为 bool 引用(std::vector<bool>)

Swig:将 std::vector<unsigned char> 传递给从 c++ 生成的 c# 函数

C++:将 vector<char> 转换为 UTF-8 字符串,以便我可以通过 Websocket 发送

c++ 在 for 循环中的 vector<char> 中的 for 循环中的内存分配