【问题标题】:Sending object of a class from client to server using serialization使用序列化将类的对象从客户端发送到服务器
【发布时间】:2014-08-14 06:21:58
【问题描述】:

我有两个类 client.cpp 和 server.cpp 使用 tcp 套接字,消息从客户端发送到服务器。 在客户中,我有一个具有不同价值观的班级员工,如下所示:

            class employee{
             int emp_id;
             char emp_name;
             float emp_weight;
             };

我已将员工的对象设为:

             employee *ptr=new employee();
             ptr->emp_id=10;
             ptr->emp_weight=50.2;
             memcpy(ptr->emp_name,"MESSAGE",7);

现在从客户端传递这个数据:

             send(socket_connection,(char*)&ptr,sizeof(ptr),NULL);

在服务器端,我收到的是:

             char *server_buffer=new char[256];
             recv(socket_connection,server_buffer,sizeof(employee),NULL);
             employee *pointer=(employee*) server_buffer;
             char b[256];
             memcpy(b,pointer->emp_name,sizeof(pointer->emp_name));
             cout <<  "Got data as "<< pointer->emp_name << "\n";
              cout <<  "Got data as "<< ptr->emp_id << "\n";
              cout <<  "Got data as "<< ptr->emp_weight << "\n";

我的问题是:

为什么我的输出中出现垃圾值以及如何解决它?

请帮助我理解这一点。我做这个活动是为了理解序列化和反序列化。

【问题讨论】:

  • 通常不建议通过 TCP 流发送原始结构,除非您真的知道自己在做什么,在字节顺序、打包/填充等方面。另外,请记住 TCP 是一个 stream - 你可能会收到 1 个字节或更多。
  • 最初我只是简单地传递整数值,即 emp_id 并且我创建了对象作为员工对象;不使用指针并访问 emp_id 作为 object.emp_id=10;接收者确实接收了它,我在输出中也得到了相同的值。但是当我通过创建指针创建对象时,我得到了垃圾值。所以,为什么会发生这种情况。

标签: c++ sockets serialization client-server deserialization


【解决方案1】:

您的员工类只有一个字符作为 emp_name 成员。您不能将像“MESSAGE”这样的字符串放入一个字符中。尝试这样做会将多余的字符复制到 emp_weight 的内存中,从而产生垃圾。您可以通过声明

来解决此问题
char emp_name[128];

在接收大小上,您必须检查来自 recv 的返回值。你得到的字节数可能比你预期的要少,当这种情况发生时你必须再次调用 recv 来得到更多的字节数。

【讨论】:

    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2021-09-23
    • 2017-12-24
    相关资源
    最近更新 更多