Peer Graph - 导入和导出数据库






4.64/5 (4投票s)
2006年1月24日
4分钟阅读

34822

649
使用 Microsoft 的 Peer-to-Peer 技术导入和导出 Peer Graph 数据库。
背景
Microsoft 的 Peer-to-Peer Graphing 技术为 Windows 对等应用程序提供了稳定、可靠的基础设施以进行通信。对等节点使用 Peer Name Resolution Protocol (PNRP - 一种无服务器 DNS) 在图中注册和发现其他对等节点。图是连接对等网络中的对等节点、服务和资源的基石。对等节点可以是用户交互式应用程序、服务或资源。Graphing 允许数据在对等节点之间高效可靠地传递。
Microsoft 的整个点对点技术通过最新的平台 SDK 以 C/C++ API 调用形式公开。但是,本文中的代码展示了如何使用 C# 从 .NET 托管代码调用这些 API。
引言
本文通过演示处理导入和导出 Peer Graph 数据库到文件的最后两个 API,完成了 Peer Graphing 系列文章。我想到了几种导出对等图当前状态的有用情况:
- 应用程序的创建者想要部署一个空白数据库。该数据库在安装过程中会自动导入,即使网络不可用,应用程序也能运行。
- 应用程序的创建者想要在数据库中包含一些默认数据。
- 导出用于应用程序备份图的当前状态,以用于灾难恢复。
- 两个对等节点之间的通信链路很慢。通过该链路同步大型数据库既耗时又不划算。取而代之的是,数据库文件被复制到 CD 或 DVD 并运输到其他位置。然后导入数据库,初始同步会很快。
Exporting
导出数据库时,实际发生的是任何发布到图中的公共记录都被保存到可以稍后导入的文件格式中。在应用程序创建者想要部署初始记录的情况下,应注意将它们的到期时间设置为无限(或遥远的未来),以避免它们在导入时到期。
PeerGraph
ExportDatabase
方法是对 PeerGraphExportDatabase
API 方法的简单封装。ExportDatabase
必须在图打开时调用。
public void ExportDatabase(string Path)
{
uint hr =
PeerGraphNative.PeerGraphExportDatabase(hGraph, Path);
if (hr != 0) throw new PeerGraphException(hr);
}
导出的文件中包含两个重要信息:图 ID 和对等节点身份(在本例中为 0.TestGraph
)。
导入
在导入数据库之前,底层 API 会将当前的图 ID 和身份与文件中存储的进行比较。如果它们不同,则会抛出 PEER_E_INVALID_DATABASE
异常。比较图 ID 可以防止其他人使用 PeerGraphCreate
来创建具有相同身份的图并尝试破坏该图。比较对等节点身份可以防止有人意外导入从其他对等图形应用程序导出的文件。
PeerGraph
ImportDatabase
方法是 static
(Shared
)的,因为在图连接时无法进行导入。ImportDatabase
方法是对 PeerGraphImportDatabase
API 方法的简单封装。
public static void ImportDatabase(string GraphName,
string Identity, string DatabaseName, string Path)
{
PeerGraph graph = new PeerGraph(GraphName);
graph.Open(DatabaseName, Identity, false);
uint hr =
PeerGraphNative.PeerGraphImportDatabase(graph.hGraph, Path);
if (hr != 0)
throw new PeerGraphException(hr);
graph.Dispose();
}
该方法首先打开一个图,但不连接。然后导入数据库并关闭图。
使用示例应用程序
示例应用程序包含一个由作者导出的数据库(test.p2pgraph)。该数据库包含作者发布的单个记录。您必须先导入此文件,然后才能打开图,否则您将收到 PEER_E_GRAPH_NOT_READY
异常。单击“导入”按钮找到文件并导入它。导入后,单击“打开”按钮打开图。您应该会看到一条包含作者消息的记录。下面展示了使用 ImportDatabase
方法的示例
private void button7_Click(object sender, System.EventArgs e)
{
DialogResult result = openFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
try
{
PeerGraph.ImportDatabase(GraphName, textBox2.Text,
DatabaseName, openFileDialog1.FileName);
LogMessage(@"Import", @"Completed");
}
catch (PeerGraphException ex)
{
LogMessage(@"Import", ex.Message);
}
}
}
打开后,您可以使用提供的文本框输入您自己的消息并将记录添加到图中。这些记录将在 10 分钟后过期。单击“导出”按钮保存数据库。在本地或另一台计算机上运行应用程序的第二个实例。输入不同的身份并导入您刚刚导出的数据库。您应该会看到您输入的消息。单击“打开”按钮打开图并与应用程序的第一个实例同步。下面展示了使用 Export database 的示例
private void button5_Click(object sender, System.EventArgs e)
{
DialogResult result = saveFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
try
{
graph.ExportDatabase(saveFileDialog1.FileName);
LogMessage(@"Export", @"Completed");
}
catch (PeerGraphException ex)
{
LogMessage(@"Export", ex.Message);
}
}
}
关注点
有时文档是错误的。在实现 ImportDatabase
函数时,我注意到 Microsoft MSDN 库中的文档在 PeerGraphImportDatabase
方法的末尾有一个小注释,这让我很担心。在与 Microsoft 的一位开发人员联系后,他们同意这是错误的。因此,这并没有使实现复杂化。希望到 2006 年中期,文档会得到更正。
资源链接
我发现以下资源对于理解对等图形非常有帮助
结论
我希望您觉得本文有所帮助。下一篇文章将介绍 Microsoft 的安全图形技术,称为 Peer Groups。
- Peer Groups - 简介
- Peer Groups - 身份
- Peer Groups - 邀请
- 对等协作 - 附近的人
- 对等协作 - 端点
- 对等协作 - 能力
- 对等协作 - 在线状态
- 对等协作 - 邀请
- 对等名称解析 - Windows Vista 增强功能
如果您对其他主题有建议,请留下评论。最后,非常感谢所有投票并给予鼓励反馈的人。
历史
初始版本。