如何连接到对等组

本主题讨论应用程序如何使用对等分组 API 连接到对等组。

加入对等组

若要加入对等组,请调用 PeerGroupJoin,传入对等方的标识名称和邀请 (以及可选的 PNRP 云名称(如果邀请中的云名称不明确) )。

如果成功, PeerGroupJoin 将返回对等组的句柄。

如果对等方以前已加入对等组,然后关闭了句柄,则应通过调用 PeerGroupOpen 并传入对等组的名称来重新打开对等组。 此调用返回新的对等组句柄。

成功加入对等组后,对等方可以直接连接到对等组,并通过调用 PeerGroupConnect 开始交互。 连接后,对等方被视为“联机”。

如果应用程序当时不与组交互,它可以保持“脱机”。 如果它选择直接参与后续实例的对等组,则对 PeerGroupConnect 的 后续调用将使其联机。 对等方加入对等组后,必须至少连接一次,才能将记录发布到对等组。

在未连接的情况下打开对等组 (脱机)

通常,你可能希望让应用程序连接到对等组,但不直接参与它,接收和发布记录更新,但不发送或接收数据消息。 调用 PeerGroupCreatePeerGroupJoinPeerGroupOpen 后,应用程序立即处于此“脱机”状态。

脱机应用程序可以随时通过调用 PeerGroupConnect 进入联机状态。 连接后,对等组无法脱机,直到与此标识关联的所有其他应用程序以及共享此组也已关闭连接。

对等组是共享资源,同一对等组可用于多个应用程序。 如果同一标识和 Windows 用户的多个应用程序使用同一对等组,则它们还会共享同一基础数据库和连接 (邻居和直接) 。 如果这些应用程序中的任何一个调用 PeerGroupConnect,则此标识/用户参与组的所有其他应用程序也会连接到该组。 如果在组处于脱机状态时由一个应用程序添加记录,其他应用程序也能够看到该记录。 因此,应用程序必须准备好随时联机。

连接到对等组 (Online)

若要开始参与组,请在创建、加入或打开组后调用 PeerGroupConnect 。 在此状态下,可以通过调用 PeerGroupOpenDirectConnection 与参与同一组的其他对等方打开直接连接。

若要检测连接尝试是否失败,请注册PEER_GROUP_EVENT_CONNECTION_FAILED事件。 如果分组基础结构找不到要连接到的另一个成员,或者如果在同步组数据库之前连接失败,并且无法建立另一个连接,则会引发此事件。

尽管在对等上执行并参与同一组且具有相同对等标识的多个应用程序可能处于脱机状态,但任何一个应用程序对 PeerGroupConnect 的调用都会导致所有应用程序变为联机状态。

此外,如果对等方上的一个应用程序已连接到该组,则调用 PeerGroupJoinPeerGroupOpen 的任何其他应用程序也会立即连接。 如果应用程序调用 PeerGroupClose,则仅关闭该应用程序的句柄。 因此,应用程序对 PeerGroupOpen 的后续调用将返回一个新的组句柄,如果参与同一组的任何其他应用程序仍处于连接状态,应用程序将立即联机。

发送和接收数据

若要在组中的特定成员节点之间发送和接收数据,必须与要与之交互的成员建立直接连接。 建立直接连接是对 PeerGroupOpenDirectConnection 的异步调用,传入已连接组的句柄以及要连接到的组中对等方的标识。 此方法将返回连接 ID。 如果调用成功,则会在对等方上引发PEER_GROUP_EVENT_DIRECT_CONNECTION事件,验证连接 ID。

若要从其他联机对等方接收直接连接,请通过调用 PeerGroupRegisterEvent 注册PEER_GROUP_EVENT_DIRECT_CONNECTION事件。

成功建立直接连接后,应用程序可以通过调用 PeerGroupSendData 开始发送数据,并传递有效的连接 ID。 多部分数据传输的顺序由 PeerGroupSendData 处理。 但是,应用程序应实现适当的协议堆栈来处理此 API 调用返回的不透明数据。

若要通过直接连接接收数据,应用程序必须使用 PeerGroupRegisterEvent 注册 PEER_GROUP_EVENT_INCOMING_DATA 事件。 事件处理程序负责获取和排序不透明数据,并将其传递给应用程序。 此数据是在事件处理程序中获取的,方法是使用已注册事件的句柄调用 PeerGroupGetEventData

直接连接通过调用 PeerGroupCloseDirectConnection 并传入先前调用 PeerGroupOpenDirectConnection 获取的连接 ID 或在PEER_EVENT_GROUP_DIRECT_CONNECTION的事件数据中接收的连接 ID 来关闭。