繁体   English   中英

具有动态内存的命名管道策略?

[英]Named Pipe strategies with dynamic memory?

好吧,所以我有一个需要IPC的应用程序...我认为命名管道是可行的方法,因为它们非常易于使用。

无论如何,我有一个关于如何使用命名管道处理动态内存的问题。

说我有一个这样的课:

class MyTestClass {
public:
    MyTestClass() { _data = new int(4); }

    int GetData() { return *_data; }
    int GetData2() { return _data2; }

private:
    int* _data;
    int _data2;
};

现在,当我创建一个充满MyTestClass对象的缓冲区,然后通过管道发送它们时,我显然在目标进程中丢失了_data并得到了垃圾。 我应该使用一些策略吗? 对于简单的情况,我可以使用值类型,但是对于许多复杂的类,我需要使用某种动态内存,并且我喜欢指针。

或者,我应该只考虑使用共享内存吗? 谢谢

命名管道和共享内存都有类似的问题:您需要将结构的内容序列化到发送方,并从接收方反序列化结构。

无论使用命名管道还是共享内存,序列化过程在本质上都是相同的。 对于嵌入式指针(如_data和_data2),您需要以一致的方式序列化指针的内容。

您可以使用许多串行化策略,具体取决于您的结构在内存中的布局方式以及IPC的效率。 或者,您可以使用DCE RPC并让RPC编组代码为您处理复杂性。

要通过命名管道发送数据,必须在发送端对数据进行序列化(或封送),并在接收端对数据进行反序列化(或解组)。

这听起来很可疑,好像您只是在数据结构中写入字节的副本一样。 这根本不好。 您不是要复制分配的数据(它不会存储在数据结构的第一个字节与最后一个字节之间,而是存储在其他地方),而是将指针( _data )从一台机器(或进程)复制到另一台机器(或进程),并且本地进程中的内存地址在另一个方面没有保证的意义。

为自己定义一个有线协议(如果是绝版,请查看ASN.1-否,再三考虑,不要那种绝版),该协议定义了用于在网上传输的数据的布局。 然后实现发送方和接收方(或序列化器和反序列化器)功能。 或者找到已经执行此操作的其他人的代码。

还要记住要处理字节顺序-您必须定义字节通过命名管道发送的顺序。

例如,您可以定义发送的消息由网络字节顺序的4字节无符号整数组成,该整数定义了要跟随的结构数,每个结构可以是数组的4个带符号4字节整数的序列,后跟一个带符号的_data2 4字节整数(也以网络字节顺序发送)。

请注意,选择命名管道作为IPC机制在很大程度上没有意义。 除非您使用共享内存(固有地在同一台计算机上),否则必须处理字节序,即使是共享内存,也需要处理序列化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM