我正在从套接字读取缓冲区字节,但我不知道如何用长度信息初始化缓冲区数组。
uint32_t len;
int lengthbytes = 0;
int databytes = 0;
// receive the length info of an image data
lengthbytes = recv(clientSocket, (char *)&len, sizeof(len), 0);
// convert hexadecimal data to length in bytes
len = ntohl(len);
// ????? how to initialize the buffer array with the length info ????
char buf[len]; -----> this is illegal in C
// read the image data
databytes = recv(clientSocket, buf, sizeof(buf), 0);
答案 0 :(得分:4)
len = ntohl(len);
char buf[len]; //----> this is illegal in C
这在C99中有效,它被称为可变长度数组。如果您不使用C99,请使用malloc
分配数组(并将buf
声明为char *
)。
答案 1 :(得分:2)
声明buf
时声明可变长度数组。这在C中是合法的(来自C99标准),但在C ++中是非法的。在C ++中,您可以使用std::vector
:
std::vector<char> buf(len);
您也可以在调用recv
时使用此向量:
databytes = recv(clientSocket, &buf[0], buf.size(), 0);
要在循环内使用向量,您有两种选择:
std::vector<char> buf;
// ...
for (int i = 0; i < number_of_images; i++)
{
std::cout << "Fetching image #" << (i + 1) << '\n';
// Get the image length
size_t length = get_image_length();
buf.clear(); // Clear the buffer
buf.resize(length); // Set the size to the image length
// Receive the image
databytes = recv(clientSocket, &buf[0], buf.size(), 0);
}
声明向量在循环中是本地的:
for (int i = 0; i < number_of_images; i++)
{
std::cout << "Fetching image #" << (i + 1) << '\n';
// Get the image length
size_t length = get_image_length();
std::vector<char> buf(length);
// Receive the image
databytes = recv(clientSocket, &buf[0], buf.size(), 0);
}
答案 2 :(得分:1)
您必须使用动态内存分配;
char* buf = new char[len];
如果您已完成buf
,请不要忘记致电delete
以释放内存。
delete[] buf;
答案 3 :(得分:1)
请通过malloc
分配缓冲区,即buf = malloc(sizeof(char) * len);
答案 4 :(得分:1)
你可以用new或malloc来做。 完成后别忘了删除缓冲区!
答案 5 :(得分:1)
您可以使用std::vector<char>
,然后使用data()
作为数组缓冲区:
#include <vector>
std::vector<char> buf(len);
databytes = recv(clientSocket, buf.data(), buf.size(), 0); // access underlying char array
databytes = recv(clientSocket, &buf[0], buf.size(), 0); // as above, C++03 version
答案 6 :(得分:1)
我在C ++中为此目的编写了一个名为tempbuf
的类。
你可以在这里找到它:
small_lib.cpp
small_lib.h
这两个文件是MIT许可的,所以你可以随意使用它。
如何使用这个课程?
tempbuf buf(len);
databytes = recv(clientSocket, buf.get(), buf.size(), 0); // if you want char* returned
databytes = recv(clientSocket, buf.constchar(), buf.size(), 0); // if you want constchar* returned
猜猜为什么我写这个课?您不需要删除或取消分配动态分配的内存,因为它是在类的析构函数中完成的。
为什么我不使用std::auto_ptr
?因为根据我的理解,这仅适用于非数组,因为它支持new X
但不支持new X[10]
。