2014-12-04 52 views
1

這是我怎麼沒到目前爲止一切:投浮法陣列/從字符*和發送通過網絡

struct HeadPacket 
{ 
    int type; 
}; 

struct ReceivePacket 
{ 
    // Header 
    HeadPacket Head; 
    // Raw Data 
    char* buffer; 
}; 
struct MovePacket 
{ 
    // Header 
    HeadPacket Head; 
    // Raw Data 
    float X; 
    float Y; 
}; 
struct ClientsPacket 
{ 
    // Header 
    HeadPacket Head; 
    // Raw Data 
    int Clients; 
    float* X; 
    float* Y; 
}; 

這些都是一些例子包我有。

首先我創建一個數據包,將它轉換爲char *併發送它。

MovePacket m; 
m.Head.type = 2; 
m.X = X; 
m.Y = Y; 
this->Socket->Send(this->Socket->GetAddress(), (char*)&m, sizeof(m)); 

在另一邊,我接受它:

char packet[256]; //max size of a packet 
SOCKADDR_IN server; 
this->Socket->Receive(packet, 256, &server); 

現在我將它轉換爲一個數據包讀取類型,然後我投它進一步

ReceivePacket* rec = (ReceivePacket*)packet; 
    switch (rec->Head.type) 
{ 
    case 0: 
    { 
    MovePacket* move = (MovePacket*)rec; 
    } 
    break; 
    case 1: 
    { 
    ClientsPacket* c = (ClientsPacket*)rec; 
    } 
    break; 
} 

如果我發送和收到一個MovePacket,一切正常。

但是,如果我發送一個ClientsPacket,它有一個浮點數組,float數組永遠不會包含正確的值。

ClientsPacket c; 
    c.Head.type = 3; 
    c.Clients = clients.size(); 
    c.Y = new float[clients.size()]; 
    c.X = new float[clients.size()]; 

    int size = sizeof(c.Head) + sizeof(int)+((sizeof(float)*clients.size()) * 2); 
    for (unsigned int i = 0; i < clients.size(); i++) 
    { 
     c.X[i] = clients[i].X; 
     c.Y[i] = clients[i].Y; 
     printf("X: %f Y: %f\n", c.Y[i], c.X[i]); 
    } 
    rc = sock.Send(newclient.GetAddr(), (char*)&c, size); 

你知道我如何解決它,並在那裏可以進一步閱讀爲什麼它發生或爲什麼會發生你能向我解釋?

+1

發送了一個指針(基本上是在你的進程的地址到內存)的值,另一個進程會不給你有用的結果。作爲一個側面提示,如果不同的端點的計算機正在進行通信,你的程序將會出現問題(參見'htonl'和'ntohl') – PeterT 2014-12-05 00:31:34

+0

它遲到了,當然,我在那裏得到了一個非常糟糕的主意。謝謝你指出。 – PuRe 2014-12-05 01:13:05

回答

0

它真的應該是什麼樣子: 服務器:

ClientsPacket c; 
    c.Head.type = 3; 
    c.Clients = clients.size(); 
    c.X = new float[clients.size()]; 
    c.Y = new float[clients.size()]; 
    //define sizes 
    int fsize = (sizeof(float)*clients.size()); 
    int hsize = sizeof(c.Head) + sizeof(c.Clients); 
    int size = hsize + sizeof(float)+(fsize*2); 
    //define sendchar 
    char* buffer = new char[size]; 
    //fill arrays 
    for (unsigned int i = 0; i < clients.size(); i++) 
    { 
     c.X[i] = clients[i].X; 
     c.Y[i] = clients[i].Y; 
     printf("X: %f Y: %f\n", c.X[i], c.Y[i]); 
    } 
    //copy memory from client 
    memcpy(buffer, &c, hsize); 
    memcpy(buffer + hsize, c.X, fsize); 
    memcpy(buffer + hsize + fsize, c.Y, fsize); 

客戶:

ClientsReceivePacket* cv = (ClientsReceivePacket*)rec; 

     ClientsPacket c; 
     memcpy(&c.Head, packet, sizeof(c.Head)); 
     memcpy(&c.Clients, packet + sizeof(c.Head), sizeof(c.Clients)); 
     c.X = new float[cv->Clients]; 
     c.Y = new float[cv->Clients]; 
     //define sizes 
     int hsize = sizeof(c.Head) + sizeof(c.Clients); 
     int fsize = (sizeof(float)*c.Clients); 
     //copy content into float array 
     memcpy(c.X, packet + hsize, fsize); 
     memcpy(c.Y, packet + hsize + fsize, fsize);