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

时间:2013-06-20 02:02:18

标签: c++ struct client winsock2

我正在用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数组并使用它来填充带有客户端编号的“Buffer”结构,以将其发送给其余的客户端(它从每个客户端调用的线程获取客户端编号作为参数) 我觉得有趣的是那个

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个ushorts,它仍然可以分配每个吗?取决于它得到的结构的顺序?

1 个答案:

答案 0 :(得分:2)

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

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

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