c++ - 如何获取 std::vector<int>* 的值?

标签 c++ networking game-development

我不知道在“标题”框中输入什么内容,因此我认为标题并不能完全回答我的问题,对此我感到很抱歉。

首先,我想介绍一下背景。我现在为了一个3D游戏发现了网络开发两周。

今天,我专注于使用 std::vector 发送包裹,以 .obj 形式发送模板,但这不是我的问题。

问题是我没有收到来自该 vector 的信息。

一图胜千言,这是我的代码(这段代码只是为了测试服务器端char[]中数据的加密以及服务器端的接收客户端)。

我的 C++ 程序:

#include <vector>
#include <iostream>

int main()
{
    /* -- server -- */
    // variables to buffer
    std::vector<int> vec = { 1, 25, 156, 0, 1 };
    short type = 25;
    int written = 0;
    char buffer[256] = {};

    memcpy(&buffer[written], &type, sizeof(type));
    written += sizeof(type);

    memcpy(&buffer[written], &vec, sizeof(vec));
    written += sizeof(vec);

    std::cout << "/* -- Server -- */\n" << std::endl;
    std::cout << "[written] --> " << "Size : " << sizeof(written) << " | Value : " << written << std::endl;
    std::cout << "[type] --> " << "Size : " << sizeof(type) << " | Value : " << type << std::endl;
    std::cout << "[vec] --> " << "Size : " << sizeof(vec) << " | Value : " << vec.data() << std::endl;

    // 'send' to client && 'receive' from server \\ (for example)
    char buffer2[256] = {};
    memcpy(&buffer2, &buffer[0], sizeof(buffer2));

    /* -- client -- */
    // buffer to variables
    std::vector<int>* vec2;
    short type2 = 0;
    int read = 0;
    
    memcpy(&type2, &buffer[read], sizeof(type2));
    read += sizeof(type2);

    memcpy(&vec2, &buffer[read], sizeof(vec2));
    read += sizeof(vec2);

    std::cout << "\n\n";
    std::cout << "/* -- Client -- */\n" << std::endl;
    std::cout << "[read] --> " << "Size : " << sizeof(read) << " | Value : " << read << std::endl;
    std::cout << "[type2] --> " << "Size : " << sizeof(type2) << " | Value : " << type2 << std::endl;
    std::cout << "[vec2] --> " << "Size : " << sizeof(vec2) << " | Value : " << vec2->data() << std::endl;


    std::cout << "\n"; system("pause");
    return 0;
}

命令返回:

/* -- Server -- */

[written] --> Size : 4 | Value : 18
[type] --> Size : 2 | Value : 25
[vec] --> Size : 16 | Value : 00589A00

/* -- Client -- */

[read] --> Size : 4 | Value : 6
[type2] --> Size : 2 | Value : 25
[vec2] --> Size : 4 | Value : 00000000

Press any key to continue...

最佳答案

memcpy(&buffer[written], &vec, sizeof(vec));

甚至在收到任何东西之前,您就已经遇到了问题。

sizeof(vec)大小为std::vector<int> 。可能是 8 或 16 字节,或者类似的东西。无论 vector 是空的,还是包含百科全书中每个页面的图像, vector 的大小始终是相同的。

vector 和 vector 中的内容是完全不同的两个东西。

vector 的size()方法给出了 vector 中值的数量,所以上面显然应该是:

    memcpy(&buffer[written], vec.data(), vec.size()*sizeof(int));

其余代码应相应调整。

同样,反序列化为 vector 的过程也是错误的,在所示代码中:

    std::vector<int>* vec2;

这是一个指向 vector 的指针。在 C++ 中,在使用指针之前,必须将其初始化为指向相同类型的现有实例。显示的代码中没有任何内容可以做到这一点。

    memcpy(&vec2, &buffer[read], sizeof(vec2));

vec2是一个指针,sizeof(vec2)将是指针的大小:4 或 8 字节。这尝试反序列化指针的原始内存地址。再说一次,这没有任何意义。

显示的代码尝试执行的操作应该是:

  1. 声明你的 vector

     std::vector<int> vec2;
    
  2. 确定将有多少值读入 vector 并调整其大小。例如,如果您知道您有 n要反序列化的原始整数数据的字节数:

     vec2.resize(n / sizeof(int));
    

此时您可以将原始数据复制到指针中。

    memcpy(vec2.data(), &buffer[written], n);

由于调整大小,这种方法效率稍低,但这是次要问题。也可以以更 C++ 友好的方式实现此逻辑,但这也是次要问题。主要问题是你的 sizeof不会神奇地告诉您将读入 vector 的字节数。这是你需要自己跟踪的事情。 C++ 能为你做的事情很少,你总是需要完成所有的工作。您需要弄清楚如何跟踪所读取的实际字节数(组成 vector 的内容),然后相应地调整大小并读入 vector 。

关于c++ - 如何获取 std::vector<int>* 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69155498/

相关文章:

linux - linux中如何获取进程或端口的网络带宽使用情况

c# - 统一错误 : Feature 'out variable declaration'

c++ - 在 O(n) 时间 O(n) 内存中计算 max(min(A[i .. i+d]))

c++ - 在 vector 中分配临时元素(知道最大数量)的最快方法?

c++ - app.config Visual Studio 创建

php - 计算给定网络中可用子网的数量

android - 如何在传入数据时唤醒 Android

java - 构图 : How to make a shape's dimensions fit around an image?

javascript - 将函数语法更改为类语法

c++ - 删除重复条目