[英]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.