gpt4 book ai didi

c - 带有指针成员的recv数据包

转载 作者:行者123 更新时间:2023-11-30 14:26:15 25 4
gpt4 key购买 nike

当接收传入的消息时,当我的数据包结构中有一个固定大小的数组时,我会收到正确的结果,如下所示

typedef struct inPacket{
int cmd;
int seqNo;
int numbers[100];
} inPacket;

然后我像这样调用recv

char buf[1024];
recv(m_socket, buf, sizeof(buf));

并将 char 数组转换为数据包类型

inPacket* p = (inPacket*)buf;

这工作正常,在转换后我在“数字”字段中有一个完整的整数数组。当传入我想要存储数字的地址时,我无法想象为什么下面的代码不起作用

void func(int* out)
{
inPacket inpacket;
inPacket.numbers = out;
recv(m_socket, (char*)&inpacket, sizeof(inPacket));
}

调用 recv 后,“numbers”数组是一个错误的指针。

传入的数组由调用函数分配

int numbers[10];
func(numbers);

最佳答案

recv 的作用是,它将数据从内部缓冲区复制到您提供的缓冲区中。所以它会覆盖你的结构的内容。您还可以将数组成员更改为其他指针,这是一个禁忌。不仅如此,您尝试将其设置为比现有数组更小的数组,这可能导致recv可能覆盖新数组之外的内存。

你需要做这样的事情:

void func(int* out, int maxnum)
{
inPacket inpacket;
recv(m_socket, (char*)&inpacket, sizeof(inPacket));

memcpy(out, inpacket.numbers, sizeof(int) * maxnum);
}

然后你像这样调用该函数:

int numbers[10];
func(numbers, 10);

编辑:如果需要动态数组,则必须修改对 recv 的调用以及结构:

typedef struct inPacket{
int cmd;
int seqNo;
int numbers[0];
} inPacket;

void func(int* out, int maxnum)
{
size_t packetSize = sizeof(inPacket) + sizeof(int) * maxnum;
inPacket *inpacket = malloc(packetSize);

recv(m_socket, inpacket, packetSize);

memcpy(out, inpacket->numbers, sizeof(int) * maxnum);

free(inpacket);
}

关于c - 带有指针成员的recv数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9393548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com