我在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;
}
服務器接收到c har數組並使用它來填充帶有客戶端號碼的「Buffer」結構以將其發送給其餘客戶端(它獲得客戶端號碼作爲每個客戶端調用的線程的參數) 我發現有趣的是
if(recv(sConnect, buffer, sizeof(sbuffer), NULL))
{
memcpy(&sbuffer, buffer, sizeof(sbuffer));
cout << "<Client " << sbuffer.ID << ":> " << sbuffer.Message <<endl;
}
它如何分配一個字符數組(char指針)到一個類型緩衝區的結構 是啊都是無效的指針,但在幕後發生了什麼? 是因爲char數組只包含2種不同的類型,它能夠根據類型初始化它們的struct object成員?
那麼如果我做了同樣的但是有兩個相似的類型呢?恩。 2在同一個緩衝區中使用,是否仍然可以分配每個緩衝區?取決於它得到的結構的順序?
請注意,從一個緩衝區複製到另一個緩衝區的字節(Char)沒有問題。但是,如果計算機沒有匹配的endians(無論int是寫爲1,2,3,4還是4,3,2,1 ..),則通過網絡發送時,您有一個int變量是一個問題。 。) –