2014-01-06 69 views
1

對不起,我的英文很差!我正在開發一個C程序通過tcp ip發送數據。這個程序應該按如下方式使用struct和union(我會把這個重要的代碼只有部分):使用struct和union通過tcp ip發送數據

***服務器發送數據:

採用的是結構與需要發送的數據:

struct movimentos{ 

    bool Frente; 
    bool Esquerda; 
    bool Direita; 
    bool Parado; 
    bool PassoDireita; 
    bool PassoEsquerda; 
}m; 

這包括這些數據並識別結構的尺寸的聯合:

union dados{ 

    movimentos m; 
    char tamanho [(sizeof movimentos)]; 
}uniao; 

,然後,我使用的「發送」功能發送的這個地址結構到客戶端:

send(winsock,uniao.tamanho,sizeof(uniao.tamanho),0); 

* Cliente接收數據:

有一種結構和工會都什麼服務器有:

struct movimentos{ 

    bool Frente; 
    bool Esquerda; 
    bool Direita; 
    bool Parado; 
    bool PassoDireita; 
    bool PassoEsquerda; 
}move; 

union dados{ 

    movimentos move; 
    char tamanho [(sizeof movimentos)]; 
}uniao; 

功能 '的recv' 接收插座和國際地址:

int bytes=recv(winsock,uniao.tamanho,sizeof(uniao.tamanho),0); 

我的問題是下面**

我想使用由服務器客戶端發送的結構的值。但我不知道該怎麼做。我想知道如何讓收到的數據能夠在程序中操作。

謝謝!

+0

你的意思是客戶要你提到收到相同的結構格式的數據? – sujin

+0

這是一個非常糟糕的主意。不要使用結構作爲網絡協議。您正在介紹大約六個不需要的依賴關係。以八位字節定義一個有線協議,並自己寫一個庫來發送和接收它。 – EJP

回答

0

使用sprintf_svsscanf

在服務器端使用你的結構在sprintf_s的幫助下創建格式化的字符串,然後發送。

在客戶端使用vsscanf來讀取格式化數據。

0

試試這個:

//~~~~~~~~~~~~~~~~SENDER 
movimentos movi; 
//send your struct by giving it's address 
send(winsock, &movi, sizeof(movimentos), 0); 
//~~~~~~~~~~~~~~~~RECEIVER 
movimentos movi; 
int bytes = recv(winsock, &movi, sizeof(movimentos), 0); 
//~~~~~~~~~~~~~~~~RECEIVER 2 (BETTER) 
movimentos movi; 
BYTE buffer[1024]; //for example 
int bytes = recv(winsock, buffer, 1024, 0); 
memcpy((void*)&movi, (void*)buffer, sizeof(movimentos)); 
+0

這是不夠的 - 因爲TCP是一個流傳輸,而不是直接暴露一個數據包,你不能確定對recv()的調用會得到一個結構的字節值,或者即使它是這樣,那些必然都來自同一個結構 - 它可能會讓你少一點,它可能會得到一個結尾和下一個結尾。另外還有一個假設,即結構在兩個系統上都以相同的方式存儲。 –