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需要注意的一点:如果向量为空,则 &v[0] 在技术上是不允许的,并且某些实现会向您断言,因此如果您从其他人那里获取缓冲区,请确保它们在使用之前不为空把戏。
C++0x 的向量有一个 .data() 成员函数(如 std::string 的)来避免这个问题并使事情更清晰。
【讨论】:
以上是关于c++ vector<char> 和套接字的主要内容,如果未能解决你的问题,请参考以下文章
(C++)将string型vector中的元素复制到char型数组中。。出错!
C++ - 将 char 引用转换为 bool 引用(std::vector<bool>)
Swig:将 std::vector<unsigned char> 传递给从 c++ 生成的 c# 函数