序列化一个struct并通过socket用C ++发送它

时间:2011-01-31 14:27:12

标签: c++ sockets serialization

我会通过C ++套接字发送一个struct。这是一个示例结构:

struct PIPPO
{
int x;
int y;
};

我使用:

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

我将上面的代码序列化并通过socket发送。问题是,如果我尝试获取测试变量的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);

4 个答案:

答案 0 :(得分:7)

通过网络发送原始二进制表示可能会导致问题,尤其是当您拥有异构网络或应用程序时。看看最适合的protobuf

答案 1 :(得分: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));

如果您不关心协议的向后兼容性等,这种方法应该可以在同一平台上正常工作。

答案 2 :(得分:1)


要发送文本表示,您可以使用boost::serialization库。 它有详细记录并支持以下功能:
1.(de)contianers的序列化
2.(de)对象树的序列化
3.指向对象(de)序列化的指针
4. Polimorphic(de)序列化
5.全类型安全
还有更多......

实际上,我认为里面有一些黑魔法发生器:)

此致 马尔钦

答案 3 :(得分:0)

是的,它引发了很多对齐和字节顺序问题。 要走的路是使用XDR或实际切换到文本表示。 所有方法,将二进制文件编码为十六进制都没用。