0

我正在从套接字读取缓冲区字节,但我不知道如何使用长度信息初始化缓冲区数组。

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);
4

7 回答 7

4
len = ntohl(len);
char buf[len];  //----> this is illegal in C  

这在 C99 中有效,称为变长数组。如果您不使用 C99,请使用malloc来分配数组(并声明buf为 a char *)。

于 2013-03-10T16:17:38.023 回答
2

当您声明时,buf您声明了一个可变长度数组。这在 C(来自 C99 标准)中是合法的,但在 C++ 中是非法的。在 C++ 中,您可以改为使用std::vector

std::vector<char> buf(len);

您也可以在调用中使用此向量recv

databytes = recv(clientSocket, &buf[0], buf.size(), 0);

要在循环中使用向量,您有两种选择:

  1. 在循环外声明变量,并在需要时使用clearand resize

    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);
    }
    
  2. 在循环内声明向量是局部的:

    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);
    }
    
于 2013-03-10T16:18:22.933 回答
1

您必须使用动态内存分配;

char* buf = new char[len];

如果你用完了buf,别忘了调用delete释放内存。

delete[] buf;
于 2013-03-10T16:17:41.887 回答
1

malloc请通过ie分配缓冲区buf = malloc(sizeof(char) * len);

于 2013-03-10T16:18:13.140 回答
1

你可以用 new 或 malloc 来做。完成后不要忘记删除缓冲区!

于 2013-03-10T16:18:17.890 回答
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
于 2013-03-10T16:18:39.577 回答
1

tempbuf我在 C++ 中专门为此目的编写了一个类。

你可以在这里找到它:
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].

于 2013-03-10T16:34:54.370 回答