使用recv()和vector <unsigned char>的更优雅的方法

Hit*_*_99 12 c++ stl vector recv

到目前为止,我有这个代码示例:

...
int nbytes =0;
vector<unsigned char> buffer;
buffer.resize(5000);
nbytes = recv(socket, &buffer[0], buffer.size(),0);
//since I want to use buffer.size() to know data length in buffer I do
...
buffer.resize(nbytes);
Run Code Online (Sandbox Code Playgroud)

是否有另一种方法,在不使用resize()两次的情况下知道缓冲区中的数据长度?因为无法将数据接收到未调整为适当大小的向量中.根据C++ STL文档,我认为reserve()方法不进行分配.另一个问题是:使用这种技术是内存泄漏安全吗?

ron*_*nag 5

您无能为力,您无法在recv通话前知道帖子大小。

一些清理:

std::vector<unsigned char> buffer(5000);
int result = recv(socket, buffer.data(), buffer.size(), 0);
if (result != -1) {
   buffer.resize(result);
} else {
   // Handle error
}
Run Code Online (Sandbox Code Playgroud)


sha*_*oth 3

这种技术是安全的、非常干净的并且是优选的。使用std::vector是在 C++ 中实现可变长度缓冲区的推荐方法。

如果您发现并非所有数据都适合向量 - 没问题,只需将其大小调整为更大的大小并传递已填充部分后面的部分的地址。

使用reserve()并不是一个好主意 - 它不会影响size()回报,因此您将失去便利并且可能不会获得任何优势。