2009-09-08 55 views
2

Hokay,所以我有一个应用程序,我需要一些IPC ...我认为命名管道是要走的路,因为它们很容易使用。命名管道动态内存策略?

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

说我有一类像这样:

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

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

private: 
    int* _data; 
    int _data2; 
}; 

现在,当我创建一个完整的MyTestClass对象的缓冲,然后送他们在管,我显然失去_data在目标进程,越来越垃圾。我应该使用这种策略吗?我可以为简单情况使用值类型,但对于许多复杂类我需要使用某种动态内存,我喜欢指针。

或者,我应该只是看看使用共享内存呢?谢谢

+0

我想你应该删除'_data2'和whatnot。它不完整(初始化),我认为你的问题无论如何都是清楚的。 – GManNickG 2009-09-08 02:37:11

+0

由于你的构造函数分配内存,你需要一个析构函数来释放内存,不是吗? – 2009-09-08 02:38:57

+0

是的,我确实需要释放它,对不起的形式抱歉...我只是想得到跨越 – Polaris878 2009-09-08 03:11:58

回答

3

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

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

您可以使用很多序列化策略,具体取决于您的结构在内存中的布局以及IPC的效率。或者你可以使用DCE RPC,让RPC封送处理代码为你处理复杂问题。

+0

感谢您的回应...我可以使用的任何协议技巧或序列化策略我可以使用?谢谢 – Polaris878 2009-09-08 03:17:52

+0

如果您正在寻找序列化策略,那么最常见的情况是文件存储。你如何将你的课程写入一个文件并在稍后阅读?如果您将IPC频道封装为“std :: streambuf”,则可能可以节省大量工作量;这样你可以共享和重用很多代码。 – MSalters 2009-09-08 10:47:00

+0

MSalters把话说出我的嘴巴。他的建议很明显。 – 2009-09-09 05:24:40

1

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

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

定义你自己的一个有线协议(如果绝望的话,看看ASN.1 - 不要,再想一想,不要那么绝望),它定义了通过线路传输数据的布局。然后实现发送者和接收者(或者seralizer和deserializer)函数。或者找到其他人的代码已经这样做了。

还记得要处理endian-ness - 你必须定义哪个序列的字节通过命名管道发送。例如,您可以定义发送的消息由网络字节顺序中的一个4字节无符号整数组成,用于定义后面有多少个结构,每个结构可以是该数组后面的4个有符号4字节整数的序列由_data2的单个带符号的4字节整数(也以网络字节顺序发送)。

请注意,命名管道作为IPC机制的选择在很大程度上并不重要;除非你使用共享内存(固有地在同一台机器上),否则必须处理endian-ness,即使使用共享内存,你也需要处理序列化。

+0

谢谢...这就是我在想...我对IPC的东西有点新。现在我只是通过哈哈发送原始字节...我想看看这些IPC机制的限制是什么。对于不在数据结构中的字节,你是100%正确的......这正是我试图解决的问题。 – Polaris878 2009-09-08 03:17:19