2013-06-20 35 views
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; 
} 

服務器接收到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在同一個緩衝區中使用,是否仍然可以分配每個緩衝區?取決於它得到的結構的順序?

+1

請注意,從一個緩衝區複製到另一個緩衝區的字節(Char)沒有問題。但是,如果計算機沒有匹配的endians(無論int是寫爲1,2,3,4還是4,3,2,1 ..),則通過網絡發送時,您有一個int變量是一個問題。 。) –

回答

2

類或結構成員的存儲只是內存,所以您可以將任何對象的內存複製到具有足夠存儲空間的任何內容中,然後通過再次複製來填充相同類型的新結構或類。小心,當你做這種事情時,沒有類型安全。

但是,是的,任何類或結構可以一般存儲爲字符的sizeof(對象)數組。字符通常是因爲它的大小是明確定義的,不像int。

哦,你的結構中的字段順序是它們將存儲在內存中的順序。

+0

請注意,不應僅使用memcmp()複製具有複雜對象的變量成員的類和結構。但是,所有基本類型都可以被複制,它只是簡單的內存數據。 –

相關問題