我正在检查 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在同一个缓冲区,它还能分配每个吗?取决于它得到的结构的顺序?