2011-01-31 92 views
1

我會通過C++套接字發送一個結構。這是一個例子的結構:序列化一個結構,並通過套接字發送它與C++

struct PIPPO 
{ 
int x; 
int y; 
}; 

,我與使用:

PIPPO test2; 
test2.x = 10; 
test2.y = 20; 

和我有上面的代碼序列化和經由套接字發送它。問題是,如果我試圖獲得測試變量的HEX值,我只能看到0A,而事實上在另一臺接收數據的計算機上,我無法將二進制數據轉換回結構體。有人能幫我嗎?

template <class T> void SerializeData(char *outputArray, T inputData) 
{ 
memcpy(outputArray, &inputData, sizeof(inputData)); 
} 

char *StrToHexStr(char *str) 
{ 
    char *newstr = new char[(strlen(str)*2)+1]; 
    char *cpold = str; 
    char *cpnew = newstr; 

    while('\0' != *cpold) { 
     sprintf(cpnew, "%02X", (char)(*cpold++)); 
     cpnew+=2; 
    } 
    *(cpnew) = '\0'; 
    return(newstr); 
} 

char *test = new char[sizeof(PIPPO)]; 

memcpy((void *)&test, (void *)&test2, sizeof(test2)); 

send(this->m_socket, test, strlen(test), 0); 

回答

7

通過電線發送原始二進制表示可能會導致您的問題,特別是當您有異構網絡或應用程序時。看看protobuf這可能是最適合這個。

+0

+1提供鏈接到`protobuf`。它看起來很有趣。 :-) – Nawaz 2011-01-31 14:40:25

+0

我alredy看到谷歌協議緩衝區,但我認爲這是一個程序,在Windows上運行,只用C++編寫的真正的開銷。我會推薦protobuffer異構應用程序,無論如何感謝您的回覆我的問題的興趣 – Stefano 2011-01-31 16:37:16

0

是的,它引發了很多對齊和字節順序問題。 要走的路是使用XDR或實際切換到文本表示。 所有的方法,你的二進制編碼到十六進制是沒用的。

2

你的代碼是不是真的不清楚,但如果你的發送者和接收者是在同一平臺上,所有你需要做的就是像下面這樣..

PIPPO to_send; 
to_send.x = 10; 
to_send.y = 20; 

// just send the structure 
send(this->m_socket, reinterpret_cast<const char*>(&to_send), sizeof(to_send), 0); 

在接收端。 。

PIPPO to_receive; 
// now read directly into the structure 
recv(this->m_socket, reinterpret_cast<char*>(&to_receive), sizeof(to_receive)); 

這種做法應該只要做工精細的同一個平臺,如果你不關心協議等

+0

我花了幾天試圖做到這一點乾淨,並幫助我解決它。人們真的過於複雜的事情,不是他們 – Charlie 2016-07-15 06:22:03

1


的向後兼容性發送文本表示,你可以使用boost::serialization庫。 這是有據可查和支持相同的特徵:
1.(反)contianers的系列化
2.(反)對象的樹
3.對象指針(反)序列
4. Polimorphic的序列化(德)系列化
5.全類型安全
等等..

其實,我覺得有一些黑魔法發生器內:)

問候, 馬爾辛

相關問題