【发布时间】:2013-03-29 17:05:22
【问题描述】:
我有一个结构对象,它由几个原始数据类型、指针和结构指针组成。我想通过套接字发送它,以便它可以在另一端使用。由于我想预先支付序列化成本,我如何初始化该结构的对象,以便可以立即发送而无需编组?例如
struct A {
int i;
struct B *p;
};
struct B {
long l;
char *s[0];
};
struct A *obj;
// can do I initialize obj?
int len = sizeof(struct A) + sizeof(struct B) + sizeof(?);
obj = (struct A *) malloc(len);
...
write(socket, obj, len);
// on the receiver end, I want to do this
char buf[len];
read(socket, buf, len);
struct A *obj = (struct A *)buf;
int i = obj->i;
char *s = obj->p->s[0];
int i obj.i=1; obj.p.
谢谢。
【问题讨论】:
-
请注意:为什么
struct A有一个指向struct B的指针,但分配的却好像struct B放在struct A之后?如果你真的想这样分配它们,你至少应该设置obj->p = (void *)((char *)obj + sizeof(struct A))。除了您的解决方案中的一般错误之外。 -
在结构中携带指针时,您将遇到需要解决的问题。由于指针只是一个内存地址,因此该内存地址在另一台机器上没有任何意义。这意味着您将需要序列化指针指向的任何信息(如果您在结构中具有指向对象的多个级别的指针,这可能会变得很麻烦)。您可能需要考虑让您的结构履行合同,以确保在序列化之前取消引用指针。
-
我强烈建议不要尝试跨套接字打包结构。相反,您应该滚动一个协议缓冲区,该缓冲区以定义的、具体的和平台独立格式保存数据,发送它,并让另一端解包并重建包。从长远来看,这将大大减少麻烦,特别是如果您通过考虑潜在的可变内容来设计具有远见的扩展包。
-
两件事。为什么不将其作为字节发送?除非双方都有不同的CPU,否则应该不是问题。关于指针的另一件事是,即使指针可以在接收端被消耗并以某种方式在那里使用,发送指针也是对攻击的邀请。
-
@AlexeyFrunze,除非双方都有不同的 CPU... 即使这本身就是问题的根源,因为那里有太多的 CPU 类型和变体,即使在相同的 CPU 上只是将它们作为字节发送并接收它们也是不正确的。想想一端有优化,另一端没有。然后很容易就会为结构选择不同的填充并破坏布局。
标签: c networking