0

我正在检查 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 类型的结构 是的,它们都是 void 指针,但幕后会发生什么?是不是因为 char 数组只包含 2 种不同的类型,所以它能够根据类型用它们初始化 struct 对象成员?

那么如果我做了同样的事情但有两种相似的类型呢?前任。2个ushorts在同一个缓冲区,它还能分配每个吗?取决于它得到的结构的顺序?

4

1 回答 1

2

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

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

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

于 2013-06-20T02:08:18.530 回答