gpt4 book ai didi

c++ - 发送/接收结构而不是 char 数组

转载 作者:行者123 更新时间:2023-11-28 03:14:56 26 4
gpt4 key购买 nike

我正在检查用 C++ 编写的聊天应用程序并发现了这个

在服务器上

int ServerThread(int ID)
{
Buffer sbuffer;

char* Recv = new char[256];
ZeroMemory(Recv, 256);

// In Send we will copy the content of the struct
// and after this we will send "Send" to the client
char* Send = new char[sizeof(Buffer)];
ZeroMemory(Send, sizeof(Buffer));

for(;; Sleep(10))
{
// Same here!
if(recv(Connections[ID], Recv, 256, NULL))
{
sbuffer.ID = ID;
memcpy(sbuffer.Message, Recv, 256);
memcpy(Send, &sbuffer, sizeof(Buffer));

for(int a = 0; a != ConCounter; a++)
{
if(Connections[a] == Connections[ID])
{

}
else
{
send(Connections[a], Send, sizeof(Buffer), NULL);
}
}
ZeroMemory(Recv, 256);
}
}

return 0;
}

结构

struct Buffer
{
int ID;
char Message[256];
};

在客户端

int ClientThread()
{
Buffer sbuffer;

char buffer[sizeof(sbuffer)] = {0};

for(;; Sleep(10))
{
// The server will send a struct to the client
// containing message and ID
// But send only accepts a char as buffer parameter
// so here we need to recv a char buffer and then
// we copy the content of this buffer to our struct
if(recv(sConnect, buffer, sizeof(sbuffer), NULL))
{
memcpy(&sbuffer, buffer, sizeof(sbuffer));
cout << "<Client " << sbuffer.ID << ":> " << sbuffer.Message <<endl;
}
}

return 0;
}

服务器接收 char 数组并使用它来填充带有客户端编号的“缓冲区”结构,以将其发送给其余客户端(它从每个客户端调用的线程中获取客户端编号作为参数)我发现有趣的是

if(recv(sConnect, buffer, sizeof(sbuffer), NULL))
{
memcpy(&sbuffer, buffer, sizeof(sbuffer));
cout << "<Client " << sbuffer.ID << ":> " << sbuffer.Message <<endl;
}

如何将 char 数组(char 指针)分配给 Buffer 类型的结构是的,两者都是空指针,但幕后发生了什么?是不是因为 char 数组只包含 2 种不同的类型,所以它能够根据类型用它们初始化结构对象成员?

那如果我用 2 个相似的类型做同样的事情呢?前任。 2 个 ushorts 在同一个缓冲区,它仍然能够分配每个吗?取决于它得到的结构的顺序?

最佳答案

类或结构成员的存储只是内存,因此您可以将任何对象的内存复制到任何具有足够存储空间的对象中,然后通过再次复制填充相同类型的新结构或类。小心,当你做这种事情时没有类型安全。

但是,是的,任何类或结构都可以一般地存储为 char 的 sizeof(object) 数组。通常选择 Char,因为它的大小定义明确,与 int 不同。

哦,结构中字段的顺序就是它们存储在内存中的顺序。

关于c++ - 发送/接收结构而不是 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204172/

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