使用序列化将类的对象从客户端发送到服务器

时间:2014-06-24 05:34:21

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

我有两个类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";

我的问题是:

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

请帮助我理解这一点。我正在做这个活动,因为我对序列化和反序列化有所了解。

1 个答案:

答案 0 :(得分:0)

您的员工类只有一个字符用于emp_name成员。你不能像#34; MESSAGE&#34;变成一个角色。尝试这样做会将多余的字符复制到emp_weight的内存中,从而产生垃圾。您可以通过声明

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

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