2011-01-31 46 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.全类型安全
等等..

其实,我觉得有一些黑魔法发生器内:)

问候, 马尔辛

相关问题